扩展字符串类在某些上下文中不起作用

时间:2016-12-16 21:56:04

标签: typescript

甚至可以在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,宁愿避免它。

2 个答案:

答案 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。