甚至可以在typescript中扩展内置类型的类型定义,例如这种构建,即使开箱即用的打字稿不知道String.repeat
方法:
interface String {
repeat(c: number): string;
}
const spaces = " ".repeat(4);
但是,当我尝试在我的一些代码中应用此模式时,我收到构建错误: https://github.com/emmanueltouzery/ng-typeview/blob/c8539fc3403f7e700a023d13655702bdb2113c1b/src/ng-typeview.ts#L18
我明白了:
src/ng-typeview.ts(18,24): error TS2339: Property 'repeat' does not exist on type '" "'.
src/ng-typeview.ts(23,20): error TS2339: Property 'repeat' does not exist on type '" "'.
而且,尽管声明了额外的方法行12-14。
我试图简化该类中的代码,或者使我的工作示例中的代码更接近我的完整代码,直到我找出破坏该功能的东西,但我没有得到任何结果。
为什么额外的界面在小样本中有效,但在我的应用程序中却没有?我正在使用tsc 2.1.4。
修改
我进一步纠正了这个问题。在同一文件中导出接口是对问题的最小再现:
interface String {
repeat(c: number): string;
}
const spaces = " ".repeat(4);
export interface Anything {
whatever: number;
}
从“导出界面”中删除“导出”,问题就消失了。
EDIT2
好了,现在我不能用我的小样本,额外的界面来完成它的工作。它是如何早一点工作的?!?!?所以我想这个问题也可以重新表述为“是否有可能让字符串在String保持es3目标上接受这个方法?”。我知道有可能转向any
,宁愿避免它。
答案 0 :(得分:2)
如果你定位es5
,那么repeat
方法没有为字符串定义,那么它是defined in lib.es6.d.ts,所以通过定位es6
,编译器会找到它。 / p>
如果您无法定位es6
,您仍然可以通过在compiler options中指定它来使用它的lib:
lib:[“es6”]
如果您想自己添加,请尝试以下方法:
declare global {
interface String {
repeat(c: number): string;
}
}
答案 1 :(得分:1)
我认为您正在处理的特定错误来自tsconfig中的目标值。当我尝试es6作为目标.repeat存在时,当我做es5时它不会。
请注意,如果您对字符串类型进行定义,则会看到声明打字稿正在使用。它可能是lib.d.ts或lib.es5.d.ts或lib.es6.d.ts(或其他东西),具体取决于你的tsconfig。