2016-12-16 80 views
0

是可能的程度打字稿甚至内建类型,比如这个版本,即使开箱即用的打字稿不知道String.repeat方法的类型定义:扩展string类在某些情况下不能正常工作

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 好吧,现在我无法使我的小样本,额外的界面或所有工作都没有。它是如何早一点工作的?!?!?所以我想这个问题也可以被重新表述为“是否有可能让打字稿接受这个方法在保持es3目标的String上?”。我知道有可能投到any,宁可避免它。

+1

添加' export'将你的文件变成'外部模块',所以'String'接口变成了模块范围,而不是全局范围。 Nitzan的回答是正确的 - 如果你需要在全局范围声明一些东西,你必须使用'declare global'。 – artem

回答

2

如果你的目标es5那么repeat方法不是字符串来定义,它是defined in lib.es6.d.ts怎么过如此通过靶向es6编译器会发现它。如果你想自己动手添加那就试试这个

lib: ["es6"]

如果您不能定位es6你仍然可以使用它的lib由compiler options指定它

declare global { 
    interface String { 
     repeat(c: number): string; 
    } 
} 
+0

就是这样!作为记录。我正在瞄准nodejs(我的机器上是6.2.2)。我不确定我是否真的可以在节点上获得完整的ES6。我想不是。但我可以得到String.repeat,这是我测试它的作品。它也不存在于我已经依赖的'@ types/node'中。 –

+0

所以我害怕添加lib:es6,然后得到运行时错误,如果这些函数实际上并未在节点中实现。似乎更安全的添加功能,因为我测试它们确实在节点上可用。 –

+0

@EmmanuelTouzery你应该可以使用打字cli工具来获取node.js 6.9的.d.ts文件到工作区中。这可能有帮助。 – Catalyst

1

我认为你正在处理的特定错误来自于你的tsconfig目标值。当我尝试es6作为目标。重复存在时,当我做es5它不。

注意,如果你去到定义字符串类型,你会看到声明打字稿使用。这可能是lib.d.ts或lib.es5.d.ts或lib.es6.d.ts(或其他),具体取决于您的tsconfig。

+0

我不这么认为:我转载它的工作,而不是使用相同的tsconfig。我的小样本工作与我的应用程序相同的tsconfig工作。此外,我设法找到一个小样本显示问题,更新了我的问题。 –

+0

嗯现在我完全困惑。现在,即使我的原始“始终工作样本”不再适用于我。按照你的说法,如果选择一个es6目标,即使没有额外的界面也能正常工作。添加额外的界面应该使它工作甚至强制es3的目标,不是吗? –

+0

对于延误感到抱歉,我认为Nitzan是对的。不,但;字符串和字符串在打字稿中实际上不相同。 – Catalyst

相关问题