TypeScript: *.ts 和 *d.ts 文件扩展名

7

我已经意识到一段时间了,有些typescript文件的扩展名是.d.ts,而其他文件则只有.ts

它们代表什么? 它们之间有什么区别?

5个回答

22

这些是声明文件,有时在网络上也称为定义文件

我将用一个示例来解释为什么需要这些文件。

假设您有一个名为lib.js的库,其中包含f函数。

"use strict";
function f() {
}
exports.f = f;

这个库与其他js文件很好地配合使用。例如,可以从main.js中使用:

var f = require('./lib').f;
f();

但是您正在使用TypeScript进行开发,并且需要使用此函数,因此在您的index.ts文件中编写以下内容:

import {f} from './lib';

但是 TypeScript 编译器会给你一个错误:

Error:(1, 17) TS2307:Cannot find module './lib'.

这是因为 TypeScript 无法读取 js 文件。因此,您需要告诉 TypeScript 编译器有关您的模块和函数的信息。当然,您不希望用 TypeScript 重写整个库。但是有一个解决方案 - 声明文件。通过将以下内容放入 lib.d.ts 文件中,您可以创建一个声明文件,以便在 index.ts 中使用 lib.js 中的函数 f

export declare function f(): void;

现在编译全部都正确了。如果你用 TypeScript 写代码,可以在 tsconfig.json 文件中加入 "declaration": true, 或者使用 -d 选项生成这些文件。

何时需要它们

因此,在 TypeScript 编译时,d.ts 文件会与其 JavaScript 对应文件一起使用,而不是使用原始的 .ts 文件,当:

  • 你想要其他人写的 TypeScript 消费你用 JavaScript 编写的库
  • 你想在 TypeScript 项目中消费用 JavaScript 编写的库

有时候,tsd.ts 文件都可用,但开发人员选择仅暴露 d.ts 文件。这是 angular2 团队为他们的 npm 仓库选择的方法。


据我所知,如果我正在开发一个 TypeScript 库,那么我不需要创建任何 .d.ts 文件,是吗? - Jordi
1
如果你希望那些使用 javascript 而不是 typescript 编写代码的人能够使用你的库,那么你确实需要提供 d.ts 文件。但正如我在答案中提到的,你无需手动编写这些文件,它们将会被 typescript 编译器自动生成。 - Max Koretskyi
可能是一个新手问题,但“你想让用TypeScript编写的人使用你用JavaScript编写的库”与“如果你想让用JavaScript而不是TypeScript编写的人使用你的库,你确实需要提供d.ts文件”相反。声明文件难道不是为了帮助TypeScript开发人员消费第三方JS文件而存在的吗?主要以智能感知的形式出现,正如你提供的优秀示例一样。 - man_luck
1
*.d.ts文件不仅适用于Javascript,纯TypeScript库也可以生成和使用它们。 - spinkus

2

.ts 是一种 TypeScript 代码文件。.d.ts 是一个声明文件,通常用于为非 TypeScript API(如 DOM 或 jQuery)定义类型。


1

.d.ts文件通常用于表示类型定义文件。通常用于已经存在于JavaScript中的库,没有TypeScript源代码。.ts文件将是您的TypeScript文件。


1
一个d.ts文件仅包含各种现有JavaScript库的函数、属性等定义。(代表确定类型的脚本)
一个.ts文件是你开发的文件,会转换为js文件。(代表类型化的脚本)

1

.d.ts文件不能包含在编译期间产生JavaScript的代码,它只用于定义(通常是外部JavaScript库的定义)。例如,在.d.ts文件中定义“namespace”而没有“declare”修饰符是错误的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接