如何为外部javascript创建TypeScript定义文件,将方法添加到String

时间:2014-12-09 15:28:03

标签: javascript string typescript

我正在尝试为此String.format for JavaScript实施创建一个TypeScript定义文件,但我很挣扎。

我还是TypeScript的新手,我已经阅读了很多关于如何创建定义的文章/片段。我发现的最好的资源之一是Steve Fenton的博客文章Complex TypeScript Definitions Made Easy。我已经按照建议的例子进行了操作,但到目前为止还没有成功。

问题是因为外部Javascript向" String"添加了一个方法。 我已经尝试过"宣布" String类如下:

declare class String {
    declare function format(str: string, obj0: any, obj1?: any, obj2?: any): string;
}

这会导致错误:Duplicate identifier 'String'

我还尝试使用界面描述类型信息:

interface String {
    format(str: string, obj0: any, obj1?: any, obj2?: any): string;
}

界面本身似乎没问题,但如果我试着打电话:

String.format("The {0} brown {1}!", "quick", "fox") 

我收到错误The property 'format' does not exist on value of type '{ prototype: String; fromCharCode(...codes: number[]): string; (value?: any): string; new(value?: any): String; }'

我假设这是因为format是一个静态方法(无论如何都是TypeScript术语),但是被定义为接口上的实例方法(因为接口不能包含静态方法定义) )。

我可能会用这个完全错误的方向,或者可能对Javascript,TypeScript或两者的某些元素有完全错误的理解。任何人至少可以把我推向正确的方向吗?

1 个答案:

答案 0 :(得分:0)

目前,我认为没有办法,因为String的定义如下,而declare var并未与其他类型合并。

declare var String: {
    new (value?: any): String;
    (value?: any): string;
    prototype: String;
    fromCharCode(...codes: number[]): string;
}

在最新的TypeScript github中,它使用可扩展的declare var String: StringConstructor进行定义。 所以在下一个版本中你可以这样做:

interface StringConstructor{
    format(str: string, obj0: any, obj1?: any, obj2?: any): string;
}

我知道这不是您所希望的答案,但我认为您必须等待下一个版本才能解决此问题。

当然,您现在可以通过将其投射到例如any来使用它。

编辑在下面的评论之后

现在可以使用当前的TypeScript版本(1.3)

这会给你带来一些安全感,演员太习惯了看起来不太好但是它在编译过程中给你一些安全性,当你输入format错误时它仍会发现错误({{1例如)。

frmat