关于TypeScript中的“ * .d.ts”


341

我很好奇,*.d.ts因为我是TypeScript的新手。有人告诉我,这种文件类似于C ++中的“头文件”,但仅适用于JS。但是,*.d.ts除非我将强制更改为*.js,否则我无法将纯JS文件转换为file *.ts。所以我有三个文件:一个JS文件,一个TS文件和一个*.d.ts文件。


  1. 他们之间是什么关系?

  2. 如何使用该*.d.ts文件?这是否意味着我可以*.ts永久删除文件?

  3. 如果是这样,该*.d.ts文件如何知道哪个JS文件正在映射到其自身?


如果有人可以给我一个例子,那就太好了。


:对于未来的人:检查了打字稿DOC typescriptlang.org/docs/handbook/declaration-files/templates/...
J.Ko

Answers:


348

“ d.ts”文件用于提供有关用JavaScript编写的API的打字稿类型信息。想法是您使用的是jQuery或下划线(现有的javascript库)。您想使用打字稿代码中的代码。

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


26
非常感谢!但是如何将* .d.ts文件映射到js文件?js文件如何知道哪个d.ts文件正在映射到自身?能给我举个例子?

3
但是d.ts文件是从js文件生成的,如果js文件对d.ts一无所知。如何在没有js文件的情况下从其他ts文件中的d.ts调用函数?我很困惑……

8
参见stackoverflow.com/questions/18091724/…。您需要在使用的ts文件顶部添加/// <参考行。您需要同时具有d.ts和.js文件。
克里斯·塔瓦雷斯

3
d.ts文件通常是从js文件文档中手写的。大量这些都可用于流行的javascript库:github.com/borisyankov/DefinitelyTyped
basarat 2014年

12
如果要为项目创建自定义文件,则将自定义d.ts文件放在哪里?
杰(Jay)

76

d代表声明文件

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

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

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所做的那样。

GitHub上的DefinitelyTypedTypings Registry中托管着大量流行的JavaScript库的声明文件。一个名为命令行实用工具分型从库提供的帮助搜索并安装申报文件。


3
注意:typings自TypeScript 2.0以来,实际上并不需要命令行工具。最新的方法是通过@types名称空间下的npm存储库使用类型包装器。有关更多详细信息,请参见github.com/typings/typings/blob/master/README.md
Burt_Harris

1
@takeshin我有一个问题。我是否需要生成仅在项目内部使用的.tsx文件的.d.ts文件?除了为第三方库提供其他信息的可能性之外,这些还会添加其他内容吗?
Krzysztof Trzos

61

我无法发表评论,因此将其添加为答案。
尝试将现有类型映射到javascript库时,我们有些痛苦。

要将.d.ts文件映射到其javascript文件,您需要为.d.ts文件指定与javascript文件相同的名称,并将它们保存在同一文件夹中,然后将需要该.d.ts文件的代码指向该文件。

例如:test.js并且test.d.ts位于testdir/文件夹中,然后将其以这种方式导入到react组件中:

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

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

export as namespace Test;

export interface TestInterface1{}
export class TestClass1{}

42
没有人回答如何将d.ts连接到js,所以我认为这是正确的地方。
ConstantinM

请注意,如果要为未创建的某些JS创建声明文件(例如,来自npm的程序包),则该.d.ts文件也必须与要导入的程序包命名相同。
electrovir

30

样例用于特定情况

假设您有要通过npm共享的my-module

您使用安装 npm install my-module

您可以这样使用它:

import * as lol from 'my-module';

const a = lol('abc', 'def');

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

module.exports = function(firstString, secondString) {

  // your code

  return result
}

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

declare module 'my-module' {
  export default function anyName(arg1: string, arg2: string): MyResponse;
}

interface MyResponse {
  something: number;
  anything: number;
}

19

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

在继续回答此职位之前,有几点需要澄清-

  1. Typescript是javascript的语法超集。
  2. Typescript不能单独运行,需要将其转换为javascript(将typescript转换为javascript
  3. “类型定义”和“类型检查”是Typescript通过javascript提供的主要附加功能。(检查类型脚本和javascript之间的区别

如果你想,如果打字稿是只是语法的超集,有什么好处呢它提供- https://basarat.gitbooks.io/typescript/docs/why-typescript.html#the-typescript-type-system

要回答此帖子-

正如我们所讨论的,打字稿是javascript的超集,需要转换为javascript。因此,如果库或第三方代码是用打字稿编写的,则最终会将其转换为可被javascript项目使用的javascript,反之亦然。

对于前-

如果您安装javascript库-

npm install --save mylib

并尝试以打字稿代码导入-

import * from "mylib";

你会得到错误。

“找不到模块'mylib'。”

正如@Chris所提到的,下划线,Jquery之类的许多库已经用javascript编写。不需要为打字稿项目重写这些库,而是需要一种替代解决方案。

为此,您可以在名为* .d.ts的javascript库中提供类型声明文件,就像上面的mylib.d.ts一样。声明文件仅提供在相应的javascript文件中定义的函数和变量的类型声明。

现在,当您尝试-

import * from "mylib";

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


3

该答案假定您具有一些不想转换为TypeScript的JavaScript,但是您希望通过对类型的更改很少而受益于类型检查.js。甲.d.ts文件是非常像C或C ++头文件。其目的是定义一个接口。这是一个例子:

mashString.d.ts

/** Makes a string harder to read. */
declare function mashString(
    /** The string to obscure */
    str: string
):string;
export = mashString;

mashString.js

// @ts-check
/** @type {import("./mashString")} */
module.exports = (str) => [...str].reverse().join("");

main.js

// @ts-check
const mashString = require("./mashString");
console.log(mashString("12345"));

这里的关系是:mashString.d.ts定义一个接口,mashString.js实现该接口并main.js使用该接口。

要使类型检查正常工作,请添加// @ts-check.js文件中。但这仅检查main.js是否正确使用了接口。为了确保mashString.js正确实现它,我们/** @type {import("./mashString")} */在导出之前添加。

您可以使用创建初始.d.ts文件,tsc -allowJs main.js -d然后根据需要手动编辑它们,以改进类型检查和文档编制。

在大多数情况下,实现和接口具有相同的名称,在此处mashString。但是您可以有其他实现。例如,我们可以重命名mashString.js为,reverse.js并有一个替代方法encryptString.js

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.