.d.ts 和.ts 文件

168 阅读3分钟

.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 项目中使用场景

  1. 为无类型的 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;
  1. 定义全局类型(避免类型重复声明)

如果你需要在项目中定义全局可用的类型(如全局接口、类型别名),可以将它们放在 .d.ts 文件中,避免在多个 .ts 文件中重复声明。例如:

// global.d.ts(全局类型声明文件)
// global.d.ts
declare global {
  interface Window {
    appConfig: {
      env: string;
      apiUrl: string;
    };
  }
}
// 整个项目都能识别 window.appConfig 的类型。
  1. 开发库时提供类型声明

如果你在开发一个供他人使用的库(如 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;
}