注册
web

停止在TS中使用.d.ts文件

看到Matt Pocock 在 X 上的一个帖子提到不使用 .d.ts 文件的说法。



你赞同么?是否也应该把 .d.ts 文件都替换为 .ts 文件呢?


我们一起来看看~




.d.ts 文件的用途


首先,我们要澄清的是,.d.ts 文件并不是毫无用处的。



.d.ts 文件的用途主要用于为 JavaScript 代码提供类型描述。



.d.ts 文件是严格的蓝图,用于表示你的源代码可以使用的类型。最早可以追溯到2012年。其设计受到头文件、接口描述语言(IDL)、JSDoc 等实践的启发,可以被视为 TypeScript 版本的头文件。


.d.ts 文件只能包含声明,所以让我们通过一个代码示例来看看声明和实现之间的区别。假设我们有一个函数,它将两个数字相加:


// 声明 (.d.ts)
export function add(num1: number, num2: number): number;

// 实现 (.ts)
export function add(num1: number, num2: number): number {
return num1 + num2;
}

正如你所见,add 函数的实现实际上展示了加法的执行过程,并返回结果,而声明则没有。




那么 .d.ts 文件在实践中是如何使用的呢?


假设我们有一个 add 函数,分别在两个文件中存储声明和实现:add.d.tsadd.js


现在我们创建一个新文件 index.js,它将实际使用 add 函数:


import { add } from "./x";

const result = add(1, 4);
console.log(result); // 输出:5

请注意,在这个 JS 文件中,add 函数具有类型安全性,因为函数在 add.d.ts 中被标注了类型声明。




替换方案 .ts 文件


我们已经了解了 .d.ts 文件的工作原理以及它们的用途。Matt 之所以认为不需要.d.ts 文件,是因为它也可以放在一个 .ts 文件中直接创建带有类型标注的实现。也就是说,拥有一个包含声明和实现的单个 add.ts 文件,等同于分别定义了 add.d.tsadd.js 文件。


这意味着你无需担心将声明文件与其对应的实现文件分开组织。




不过,针对类库,将 .d.ts 文件与编译后的 JavaScript 源代码一起使用,比存储 .ts 文件更高效,因为你真正需要的只是类型声明,以便用户在使用你的库时能够获得类型安全性。


这确实没错,需要强调的是,更推荐自动生成。通过更改 package.jsontsconfig.json 文件中的几个设置,从 .ts 文件自动生成 .d.ts 文件:



  • tsconfig.json:确保添加 declaration: true,以支持 .d.ts 文件的生成。

{
"compilerOptions": {
"declaration": true,
"target": "ES6",
"module": "commonjs",
"outDir": "./dist",
"strict": true
},
"include": ["src/**/*"]
}


  • package.json:确保将 types 属性设置为生成的 .d.ts 文件,该文件位于编译后的源代码旁边。

{
"name": "stop using d.ts",
"version": "1.0.0",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc"
}
}



结论


.d.ts 文件中可以做到的一切,都可以在 .ts 文件中完成。


.ts 文件中使用 declare global {} 语法时,花括号内的内容将被视为全局环境声明,这本质上就是 .d.ts 文件的工作方式。


所以即使不使用.d.ts文件,也可以拥有全局可访问的类型。.ts文件在功能上既可以包含代码实现,又可以包含类型声明,而且还能实现全局的类型声明,从而在开发过程中可以更加方便地管理和使用类型,避免了在.d.ts文件和.ts文件之间进行复杂的协调和组织,提高了开发效率和开发体验。




另外需要注意的是,在大多数项目中,开发者会在 TypeScript 的配置文件(tsconfig.json)中将 skipLibCheck 选项设置为 true。skipLibCheck 的作用是跳过对库文件(包括 .d.ts 文件)的类型检查。当设置为 true 时,TypeScript 编译器不会对这些库文件进行严格的类型检查,从而加快编译速度。但这也会影响项目中自己编写的 .d.ts 文件。这意味着,即使 .d.ts 文件中定义的类型存在错误,TypeScript 编译器也不会报错,从而失去了类型安全性的保障。


而我们直接使用 .ts 文件,就不会有这个问题了,同事手动编写 .d.ts 文件,也会更加安全和高效。




因此,.d.ts 文件确实没有必要编写。在 99% 的情况下,.ts 文件更适合使用,可以改善开发体验,并降低库代码中出现类型错误的可能性。


怎么样??你同意他的看法么?


作者:叶知秋水
来源:juejin.cn/post/7463817822474682418

0 个评论

要回复文章请先登录注册