.d.ts 和.ts 文件
- .d.ts 文件是 TypeScript 的声明文件,用于描述 JavaScript 代码的类型信息。
- .ts 文件是 TypeScript 的源代码文件,用于编写 TypeScript 代码。
.d.ts 和.js 组合 近似等价 .ts 文件
功能重叠部分
- .d.ts(类型声明文件)负责提供类型信息,.js(JavaScript 文件)负责提供运行时代码实现。
- .ts(TypeScript 文件)则同时包含类型信息和运行时代码,
编译后会生成对应的 .js 文件和 .d.ts 文件(若开启声明文件生成)。 从 “类型信息 + 运行时代码” 的组合来看,.d.ts + .js 确实能实现与 .ts 文件相似的效果(既保证类型检查,又有可执行代码)。
差异
- 开发体验:.ts 文件中类型和代码是 “活的”,TypeScript 会实时校验类型与代码的一致性;而 .d.ts + .js 是
分离的,若 .d.ts 声明与 .js 实现不一致(比如参数类型不匹配),TypeScript 无法自动检测,可能导致类型错误。 - 编译过程:.ts 需要通过
编译器(tsc)转换为 .js;而 .d.ts + .js无需编译(.js 可直接运行,.d.ts 仅用于类型检查)。 - 适用场景:.d.ts + .js 多用于为已有 JavaScript
代码补充类型(如第三方库);.ts 则是原生开发 TypeScript 项目的首选,能确保类型与代码始终同步。
.d.ts 文件在 ts 项目中使用场景
- 为无类型的 JavaScript 代码补充类型:
在项目中使用了纯 JavaScript 库(或自己写的 .js 文件),且这些文件没有自带类型声明,TypeScript 无法识别其类型,会报 “类型缺失” 错误。此时,需要手动创建 .d.ts 文件来描述这些 .js 文件的类型。
// utils.js(纯JS文件,无类型)
export function formatDate(date) {
return date.toLocaleDateString();
}
// utils.d.ts(类型声明文件)
export function formatDate(date: Date): string;
- 定义全局类型(避免类型重复声明)
如果你需要在项目中定义全局可用的类型(如全局接口、类型别名),可以将它们放在 .d.ts 文件中,避免在多个 .ts 文件中重复声明。例如:
// global.d.ts(全局类型声明文件)
// global.d.ts
declare global {
interface Window {
appConfig: {
env: string;
apiUrl: string;
};
}
}
// 整个项目都能识别 window.appConfig 的类型。
- 开发库时提供类型声明
如果你在开发一个供他人使用的库(如 npm 包),通常需要将类型声明单独放在 .d.ts 文件中,并在 package.json 中通过 types 字段指定,方便其他 TypeScript 项目使用时获取类型信息。之所以这样是因为他人可能没有使用 ts 编译器,而只是使用了 js 文件,因此需要保证声明,.d.ts 不需要编译。
declare 关键字
declare 关键字用于在 TypeScript 中声明全局变量、函数、类、接口等类型,而无需实际实现。它通常用于为已存在的 JavaScript 代码添加类型信息,或者为全局对象添加类型定义。
// 用于函数重载
export declare function formatDate(date: Date): string;
export declare function formatDate(date: string): string;
// 用于类
export declare class MyClass {
constructor(): void;
method(): void;
}
// 用于命名空间
declare namespace hhh {
function a(): string;
function b(): number;
}