应该在*.d.ts文件中定义TypeScript接口

Kev*_*vin 8 javascript node.js typescript

TypeScript新手问题.在我们的项目中,我们使用了一些外部JavaScript库,我们需要添加*.d.ts文件.我理解这个用例以及我们需要这样做的原因.

但是,对于我们自己定义的接口,我的一个开发人员建议我们在*.d.ts文件中定义它们,以便我们可以访问接口类型而无需将其导入需要使用它的模块中.

例如,我们想为"错误优先回调"函数创建一个接口,以便我们可以在许多方面重用它.

而不是这个......

export function helloWorldEventually(callback: (err: Error, result: any) => void) {
  callback(null, 'Hello World');
}
Run Code Online (Sandbox Code Playgroud)

我们可以为错误第一次回调定义一个接口,就像这样......

export interface ErrorFirstCallback {
  (err: Error, result: any): void;
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它......

export function helloWorldEventually(callback: ErrorFirstCallback) {
  callback(null, 'Hello World');
}
Run Code Online (Sandbox Code Playgroud)

首先,我刚刚在ErrorFirstCallback.ts中定义了ErrorFirstCallback接口,并导入它以便引用它.

另一位开发人员建议我们输入一个*.d.ts文件,然后我们就不需要导入它来引用它.

我们定义的接口何时应该在*.d.ts文件和*.ts文件中定义.

谢谢!

for*_*d04 12

另一位开发人员建议我们将 [接口] 放在 *.d.ts 文件中,然后我们就不需要导入它来引用它。

使用.d.tsvs..ts文件与在本地/模块或全局/脚本范围内提供类型声明无关。

你可以export接口ErrorFirstCallback,所以其他人将不得不import它。或者您不使用export/import使文件成为全局脚本。然后,ErrorFirstCallback无需导入即可使用。在这种情况下,文件是否具有.ts.d.ts扩展名并不重要。

我们定义的接口什么时候应该在 *.d.ts 文件和 *.ts 文件中定义。

什么事情是,.d.ts文件仅仅看作是编译器的输入,而不是排放到你的dist/build文件夹。

作为一个很好的经验法则,.ts如果您想将类型作为 npm 包或公共类型 API 的一部分提供,以便在构建步骤中更轻松(它将作为编译器输出发出),则将类型放在 中。

您可以将.d.ts文件用于项目的内部使用类型。

  • 谢谢,这澄清了很多事情。- 即使您将文件命名为 *.d.ts 或 *.ts,唯一重要的是您是否具有顶级导出。如果您有导出,那么它将是一个需要导入的模块。如果您没有导出,它将被视为全局脚本,可供所有模块使用。也就是说,是否有理由使用一种命名约定与其他命名约定 - *.d.ts 与 *.ts ? (2认同)

Mic*_*ick 7

声明文件描述了外部JavaScript库的形状.例如,使用jQuery $将导致TypeScript错误而没有声明文件,因为$JQuery未定义.因此,一个声明文件创建一个接口,因此编译器知道"如果这个变量属于JQuery类型,它必须具有函数x,y,z"

在为项目创建接口时,您应该将它们放在任何您喜欢的位置:在一个大的接口文件中,在每个接口的单个​​文件中,或者在它可能属于的文件中,但是在声明文件中会非常不方便.

我个人喜欢为每个模块/类/接口提供单独的文件.但这仅仅是品味问题.

考虑创建声明文件的唯一方法是让其他开发人员可以在他们的项目中使用最终的JavaScript文件(而不是TypeScript!).

  • 我将遵循这个一般规则:如果我正在创建一个接口,那么它应该只是一个普通的 *.ts 文件,但是如果我们需要添加一个接口或为外部 JS 模块输入,那么使用它是有意义的一个声明文件。感谢您的回答! (3认同)