我已经意识到一段时间了,有些typescript文件的扩展名是.d.ts
,而其他文件则只有.ts
。
它们代表什么? 它们之间有什么区别?
我已经意识到一段时间了,有些typescript文件的扩展名是.d.ts
,而其他文件则只有.ts
。
它们代表什么? 它们之间有什么区别?
这些是声明文件,有时在网络上也称为定义文件
。
我将用一个示例来解释为什么需要这些文件。
假设您有一个名为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
文件,当:
有时候,ts
和 d.ts
文件都可用,但开发人员选择仅暴露 d.ts
文件。这是 angular2
团队为他们的 npm
仓库选择的方法。
.d.ts文件通常用于表示类型定义文件。通常用于已经存在于JavaScript中的库,没有TypeScript源代码。.ts文件将是您的TypeScript文件。
.d.ts文件不能包含在编译期间产生JavaScript的代码,它只用于定义(通常是外部JavaScript库的定义)。例如,在.d.ts文件中定义“namespace”而没有“declare”修饰符是错误的。
.d.ts
文件,是吗? - Jordid.ts
文件。但正如我在答案中提到的,你无需手动编写这些文件,它们将会被 typescript 编译器自动生成。 - Max Koretskyi