乐闻世界logo
搜索文章和话题

Typescript 中的 dts 文件的作用是什么?

7 个月前提问
3 个月前修改
浏览次数159

7个答案

1
2
3
4
5
6
7

.dts 文件,即 TypeScript 声明文件,是一种提供 TypeScript 代码中存在的各类值的类型信息的文件。这些文件通常用于两个主要场景:

  1. 与 JavaScript 库的互操作:当 TypeScript 代码需要与纯 JavaScript 库一起工作时,.dts 文件可以提供该 JavaScript 库中函数、对象和类的类型定义。这样,TypeScript 编译器就能理解 JavaScript 库的结构,并且确保 TypeScript 代码以类型安全的方式使用这些库。

  2. 模块声明:在 TypeScript 项目中,如果某个模块不希望暴露它的源代码,但需要让其他 TypeScript 代码理解其公共接口的类型信息,那么就可以使用 .dts 文件来声明这些公共接口。

一个简单的例子是,假设有一个简单的 JavaScript 函数库 math-lib.js,它提供了一个加法函数:

javascript
// math-lib.js function add(a, b) { return a + b; } module.exports = { add };

要在 TypeScript 中使用这个库并享受类型检查的好处,我们需要一个声明文件 math-lib.d.ts,如下所示:

typescript
// math-lib.d.ts export function add(a: number, b: number): number;

有了这个声明文件,TypeScript 代码可以安全地导入和使用 add 函数,并且如果尝试传入非数字类型的参数,TypeScript 编译器将会产生错误。

使用声明文件,从而使得 TypeScript 项目能够更加安全地使用外部 JavaScript 代码库,同时也能帮助开发者更好地理解外部代码的类型结构。

2024年6月29日 12:07 回复

“d.ts”文件用于提供有关用 JavaScript 编写的 API 的打字稿类型信息。这个想法是你正在使用像 jQuery 或 underscore 这样的东西,一个现有的 javascript 库。您想从打字稿代码中使用这些内容。

您可以编写仅包含类型注释的 d.ts 文件,而不是在打字稿中重写 jquery 或下划线或其他内容。然后,您可以从 Typescript 代码中获得静态类型检查的 TypeScript 优势,同时仍然使用纯 JS 库。

这要归功于 TypeScript 的限制,即不允许您在语句末尾添加“.ts”扩展名import。因此,当您引用某个文件时,比如说,my-module.js如果它my-module.d.ts旁边有 ,那么 TypeScript 将包含其内容:

shell
src/ my-module.js my-module.d.ts index.ts

我的模块.js

shell
const thing = 42; module.exports = { thing };

我的模块.d.ts

shell
export declare const thing: number;

索引.ts

shell
import { thing } from "./my-module"; // <- no extension // runtime implementation of `thing` is taken from ".js" console.log(thing); // 42 // type declaration of `thing` is taken from ".d.ts" type TypeOfThing = typeof thing; // number
2024年6月29日 12:07 回复

d代表声明文件

当编译 TypeScript 脚本时,可以选择生成一个声明文件(扩展名为 .d.ts),该文件充当已编译 JavaScript 中组件的接口。在此过程中,编译器会剥离所有函数和方法体,仅保留导出类型的签名。当第三方开发人员从 TypeScript 使用 JavaScript 库或模块时,生成的声明文件可用于描述导出的虚拟 TypeScript 类型。

声明文件的概念类似于 C/C++ 中的头文件的概念。

shell
declare module arithmetics { add(left: number, right: number): number; subtract(left: number, right: number): number; multiply(left: number, right: number): number; divide(left: number, right: number): number; }

可以为现有 JavaScript 库手动编写类型声明文件,就像为 jQuery 和 Node.js 所做的那样。

流行 JavaScript 库的大量声明文件托管在 GitHub 上的DefinelyTypedTypings Registry中。提供了一个名为Typings的命令行实用程序来帮助从存储库中搜索和安装声明文件。

2024年6月29日 12:07 回复

我从必须使用.d.ts文件煞费苦心地映射 JavaScript 项目中学到了以下内容。

使用.d.ts文件映射 JavaScript 要求您的.d.ts文件命名与您的文件命名相同.js。每个文件都需要与同名文件.js保持内联(保存在同一目录中) 。.d.ts将需要类型的 JS/TS 代码从.d.ts文件指向.d.ts文件。

例如:test.jstest.d.ts位于testdir/文件夹中,然后将其导入到反应组件中:

shell
import * as Test from "./testdir/test";

.d.ts文件被导出为命名空间,如下所示:

shell
export as namespace Test; export interface TestInterface1{} export class TestClass1{}
2024年6月29日 12:07 回复

针对_特定案例的_工作示例

假设您有通过_npm_共享的_my-module_。

你安装它npm install my-module

你这样使用它:

shell
import * as lol from 'my-module'; const a = lol('abc', 'def');

该模块的逻辑全部在index.js

shell
module.exports = function(firstString, secondString) { // your code return result }

要添加类型,请创建一个文件index.d.ts

shell
declare module 'my-module' { export default function anyName(arg1: string, arg2: string): MyResponse; } interface MyResponse { something: number; anything: number; }
2024年6月29日 12:07 回复

就像 @takeshin 所说的 .d 代表打字稿(.ts)的声明文件。

在继续回答这篇文章之前需要澄清几点 -

  1. Typescript 是 javascript 的语法超集。
  2. Typescript 不能单独运行,它需要被转译为 javascript(Typescript 到 javascript 转换
  3. “类型定义”和“类型检查”是 Typescript 通过 JavaScript 提供的主要附加功能。(检查 type script 和 javascript 之间的区别

如果您认为 typescript 只是语法超集,那么它有什么好处 - https://basarat.gitbooks.io/typescript/docs/why-typescript.html#the-typescript-type-system

回答这篇文章 -

正如我们所讨论的,TypeScript 是 javascript 的超集,需要转换为 javascript。因此,如果库或第三方代码是用 typescript 编写的,它最终会转换为可由 javascript 项目使用的 javascript,但反之亦然。

对于前 -

如果你安装了 javascript 库 -

shell
npm install --save mylib

并尝试在打字稿代码中导入它 -

shell
import * from "mylib";

你会得到错误。

“找不到模块‘mylib’。”

正如@Chris 提到的,许多库(例如 underscore、Jquery)已经用 javascript 编写。我们需要一种替代解决方案,而不是为打字稿项目重写这些库。

为此,您可以在名为 *.d.ts 的 javascript 库中提供类型声明文件,如上面的情况 mylib.d.ts 所示。声明文件仅提供各自 javascript 文件中定义的函数和变量的类型声明。

现在当你尝试时 -

shell
import * from "mylib";

mylib.d.ts 被导入,充当 javascript 库代码和 typescript 项目之间的接口。

2024年6月29日 12:07 回复

TypeScript 的 .dts 文件是定义文件(Definition Files)的缩写。它们用于为已存在的 JavaScript 代码提供类型定义信息。这意味着你可以在 TypeScript 项目中使用纯 JavaScript 写的库或框架,而 .dts 文件会告诉 TypeScript 编译器这些库的结构,包括它们的类型、函数、类和其他 API 的签名。

.dts 文件的好处是它们允许开发者在不改变原有 JavaScript 代码的情况下,享受到 TypeScript 提供的类型检查和代码自动补全等特性。

例如,如果你在 TypeScript 项目中使用 jQuery,你可以引入 jQuery 的定义文件(通常通过 DefinitelyTyped 社区提供的 @types/jquery 包),这样 TypeScript 编译器就能理解 jQuery 的 $ 函数、jQuery 对象的方法等等。代码示例如下:

typescript
// 引入 jQuery 的类型定义 /// <reference types="jquery" /> // 使用 jQuery $('selector').html('Hello, world!');

在这个例子中,$('selector').html('Hello, world!'); 这行代码通过了 TypeScript 编译器的类型检查,因为 .dts 文件提供了 .html() 方法的类型信息。

定义文件也可以帮助开发者理解第三方库的使用方式,因为它们充当了库的文档。通过查看定义文件,开发者可以了解到某个函数接受哪些参数,这些参数的类型是什么,以及函数返回什么类型的值。这极大地提高了开发效率和代码的安全性。

最后,.dts 文件也可以用来定义自己的代码的公共接口,特别是在编写库时,这样使用你库的其他 TypeScript 用户就可以获得类型检查和代码智能提示。

2024年6月29日 12:07 回复

你的答案