【问题标题】:How to create TypeScript definition file for external javascript which adds methods to String如何为外部 javascript 创建 TypeScript 定义文件,将方法添加到 String
【发布时间】:2014-12-09 15:28:03
【问题描述】:

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

我还是 TypeScript 的新手,我已经阅读了很多关于如何创建定义的文章/sn-ps。我发现的最好的资源之一是 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 或两者的某些元素有完全错误的理解。请问有人至少可以将我推向正确的方向吗?

【问题讨论】:

标签: javascript string typescript


【解决方案1】:

目前,我认为没有办法,因为 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 错误时它仍然会捕获错误(例如frmat)。

interface CustomString {
    format(str: string, obj0: any, obj1?: any, obj2?: any): string;
}
var foo = "foo";
var ret = (<CustomString><any>foo).format("bar", "baz");

【讨论】:

  • 感谢您的回答,非常感谢。您不能再详细说明您的上一条评论吗?我会将什么投射到“任何”?
  • 添加了我的答案以及有关演员表的信息:)
  • 谢谢!我已将您在上面建议的接口添加到定义文件中,并将我的打字稿代码更改为:(&lt;CustomString&gt;&lt;any&gt;String).format("The {0} brown {1}", "quick", "fox"); 这并不完美(就像您说的那样),但它并不太难看。它肯定会在下一个 TypeScript 版本之前使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 2015-11-19
  • 2014-11-06
  • 1970-01-01
  • 2017-03-02
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多