gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:46:27 25 4
gpt4 key购买 nike

我正在尝试为此 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;
}

这会导致错误:重复的标识符“String”

我还尝试使用接口(interface)来描述类型信息:

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

界面本身看起来不错,但如果我尝试调用:

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

我收到错误类型“{prototype:String;”的值上不存在属性“format” fromCharCode(...代码: number[]): string; (值?:任意):字符串;新(值?:任意):字符串; }'

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

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

最佳答案

目前,我认为没有办法,因为 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");

关于javascript - 如何为外部 javascript 创建 TypeScript 定义文件,将方法添加到 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com