TypeScript新手问题。在我们的项目中,我们使用了一些外部JavaScript库,我们需要添加* .d.ts文件。我理解这个用例以及我们需要这样做的原因。
但是,对于我们自己定义的接口,我的一位开发人员建议我们在* .d.ts文件中定义它们,以便我们可以访问接口类型而无需将其导入需要使用的模块它
例如,我们想为"错误优先回调创建一个接口"功能,以便我们可以在许多领域重复使用它。
所以不要这样......
export function helloWorldEventually(callback: (err: Error, result: any) => void) {
callback(null, 'Hello World');
}
我们可以为错误的第一个回调定义一个接口,如...
export interface ErrorFirstCallback {
(err: Error, result: any): void;
}
并像这样使用它......
export function helloWorldEventually(callback: ErrorFirstCallback) {
callback(null, 'Hello World');
}
首先,我刚刚在ErrorFirstCallback.ts中定义了ErrorFirstCallback接口,并导入它以便引用它。
另一位开发人员建议我们输入一个* .d.ts文件然后我们就不需要导入它来引用它。
我们定义的接口何时应该在* .d.ts文件和* .ts文件中定义。
谢谢!
答案 0 :(得分:8)
另一位开发人员建议我们将[接口]放在* .d.ts文件中,然后就无需导入即可引用它。
使用.d.ts
和.ts
文件与在本地/模块或全局/脚本范围内提供类型声明无关。
您可以export
界面ErrorFirstCallback
,因此其他人将不得不import
。或者,您不使用export
/ import
将文件设为全局脚本。然后,可以ErrorFirstCallback
使用而无需导入。在这种情况下,文件的扩展名是.ts
还是.d.ts
都没关系。
何时在* .d.ts文件和* .ts文件中定义我们定义的接口。
重要的是,.d.ts
个文件are only seen as compiler input并没有发送到您的dist
/ build
文件夹中。
根据经验,如果要作为npm软件包或公共类型API的一部分提供类型,请将其放在.ts
中,以简化构建步骤(作为编译器输出发出)。
您可以将.d.ts
文件用于项目的内部使用类型。
答案 1 :(得分:5)
声明文件描述了外部JavaScript库的形状。例如,使用带有$
的jQuery将导致没有声明文件的TypeScript错误,因为$
或JQuery
未定义。因此,声明文件创建一个接口,因此编译器知道“如果此变量是JQuery类型,它必须具有函数x,y,z”
在为项目创建接口时,您应该将它们放在任何您喜欢的位置:在一个大的接口文件中,在每个接口的单个文件中,或在它可能属于的文件中,但是在声明文件中非常不方便。
我个人喜欢为每个模块/类/接口提供单独的文件。但这仅仅是品味问题。
考虑创建声明文件的唯一方法是让其他开发人员可以在他们的项目中使用最终的JavaScript文件(而不是TypeScript!)。
答案 2 :(得分:0)
您使用的是typings
吗?这似乎是管理第三方类型的社区方式。这样您就不必管理其他开发人员的定义了。的API。
作为参考点,节点环境d.ts似乎只是在整个API中定义(err, res)
回调(https://github.com/typed-typings/env-node/blob/master/6/node.d.ts)