此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中很容易做到。这样做有很好的语法理由,即使我想要的东西可以通过丑陋的“正常”功能来完成。