TypeScript:使用任意方法扩展内置String类型

时间:2016-12-23 16:45:59

标签: typescript

此TypeScript代码有效:

// works!

interface String {
  mystartswith: (str: string) => boolean;
}

String.prototype.mystartswith = function(test): boolean {
  return this.lastIndexOf(test, 0) === 0;
};

console.log('abcd'.mystartswith('abc')); // prints 'true'

它编译并运行并执行您期望的等效JS代码。

此代码无法编译:

interface String {
  mystartswith: (str: string) => boolean; // there are errors on this line
}
String.prototype.mystartswith = function(test: string): boolean {
  return this.lastIndexOf(test, 0) === 0;
};

export class MyClass {
  constructor(public arg: string) {
      if (arg.mystartswith('/')) { // and errors on this line
          console.log('arg starts with /');
      }
    }
}

当我从该行中取出导出关键字时,它会工作并编译。如何声明另一个模块使用的类,但内部将使用String.prototype扩展,因此我不必编写丑陋的代码,如:

function String_mystartswith(that, test): boolean {
  return that.lastIndexOf(test, 0) === 0;
};
if (String_mystartswith('abcd', 'abc')) {
  console.log('Oh TypeScript, my TypeScript.');
}

我不一定需要在此文件之外使用此扩展名,尽管这样会很好。 此外,我正在ES5环境中部署,因此我不能将ES6 JavaScript与内置的String.startsWith一起使用,据我所知。在我去的时候,有一个通用的方法可以修补标准库中的这些缺点。

所有这些我正在做的事情和侧面探索让我不再喜欢TypeScript。只需编译我的代码,而不是让我浪费一个多小时'abcd'.mystartswith('abc')!

编辑:我澄清说我不是在询问.startsWith,内置的ES6方法,但是如何添加我自己的,特别是如果它们在ES5中缺失。任意方法,在vanilla JavaScript中很容易做到。这样做有很好的语法理由,即使我想要的东西可以通过丑陋的“正常”功能来完成。

0 个答案:

没有答案