关于TypeScript中的"*.d.ts"

255 typescript .d.ts

因为*.d.tsTypeScript的新手而感到好奇.有人告诉我,这种文件类似于C++中的"头文件",但仅适用于JS.但我无法将纯JS文件转换为*.d.ts文件,除非我强制更改*.js*.ts.所以我有三个文件:一个JS文件,一个TS文件和一个*.d.ts文件.


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

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

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


非常感谢!如果有人能给我一个例子,那将是非常好的.

Chr*_*res 275

"d.ts"文件用于提供有关用JavaScript编写的API的打字稿类型信息.这个想法是你使用的东西,如jQuery或下划线,一个现有的JavaScript库.您想要使用打字稿代码中的那些.

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

  • 非常感谢!但是如何将*.d.ts文件映射到js文件?js文件如何知道哪个d.ts文件映射到自身?能给我举个例子? (14认同)
  • 如果您为项目制作自定义文件,您在哪里放置自定义d.ts文件? (11认同)
  • 请参阅http://stackoverflow.com/questions/18091724/search-path-for-typescript-d-ts-files.您需要在消费ts文件的顶部添加/// <参考线.您需要同时提供d.ts和.js文件. (5认同)
  • .js 文件对 .d.ts 文件一无所知 - 这些文件用于其他 .ts 文件,而不是 js 文件。以后再说。 (2认同)
  • 但是d.ts文件是从js文件生成的,如果js文件对d.ts一无所知.如何在没有js文件的情况下从其他ts文件中的d.ts调用函数?我很困惑...... (2认同)
  • d.ts文件通常是从js文件文档手写的.大量的这些可用于流行的JavaScript库:https://github.com/borisyankov/DefinitelyTyped (2认同)
  • 对于那些感兴趣的人,有一个页面描述了“.d.ts”文件的搜索位置(https://www.typescriptlang.org/docs/handbook/module-resolution.html)。 (2认同)
  • 我添加了“.d.ts”文件的使用示例。希望能回答您的一些问题! (2认同)

tak*_*hin 52

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;
}
Run Code Online (Sandbox Code Playgroud)

类型声明文件可以手工编写现有的JavaScript库,就像jQuery和Node.js一样.

流行的JavaScript库的大量声明文件集合托管在DefinitelyTypedTypings Registry的 GitHub上.提供了一个名为typings的命令行实用程序,用于帮助从存储库中搜索和安装声明文件.

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

Con*_*inM 37

我无法评论,因此将其作为答案添加.我们试图将现有类型映射到javascript库时遇到了一些麻烦.

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

例如:test.js和test.d.ts在testdir中,然后你在反应组件中这样导入它:

import * as Test from "./testdir/test";
Run Code Online (Sandbox Code Playgroud)

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

export as namespace Test;

export interface TestInterface1{}
export class TestClass1{}
Run Code Online (Sandbox Code Playgroud)

  • 没有人给出如何将d.ts连接到js的答案,所以我认为这是正确的地方. (25认同)
  • 请注意,如果您要为某些并非您创建的 JS(例如来自 npm 的包)创建声明文件,则 .d.ts 文件也必须与要导入的包命名相同. (2认同)
  • 如果模块像这样导入(不要问我为什么): `import x from "x/x.js"` 即末尾有一个文件扩展名怎么办?尝试将 d.ts 文件命名为“x.js.d.ts”,但这似乎不起作用 (2认同)

Bor*_*hik 15

样例用于特定情况

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

您使用安装 npm install my-module

您可以这样使用它:

import * as lol from 'my-module';

const a = lol('abc', 'def');
Run Code Online (Sandbox Code Playgroud)

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

module.exports = function(firstString, secondString) {

  // your code

  return result
}
Run Code Online (Sandbox Code Playgroud)

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

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

interface MyResponse {
  something: number;
  anything: number;
}
Run Code Online (Sandbox Code Playgroud)


Kes*_*hav 10

就像@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
Run Code Online (Sandbox Code Playgroud)

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

import * from "mylib";
Run Code Online (Sandbox Code Playgroud)

你会得到错误。

“找不到模块'mylib'。”

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

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

现在,当您尝试-

import * from "mylib";
Run Code Online (Sandbox Code Playgroud)

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

  • 你到底把 mylib.d.ts 放在哪里?它可以在您的代码库中的任何位置吗?只在最高层吗?某些配置文件需要指向它吗? (2认同)

Jam*_*mes 8

此答案假设您有一些不想转换为 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;
Run Code Online (Sandbox Code Playgroud)

混搭字符串.js

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

主文件

// @ts-check
const mashString = require("./mashString");
console.log(mashString("12345"));
Run Code Online (Sandbox Code Playgroud)

这里的关系是: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.jsreverse.js并有一个替代encryptString.js.


Emi*_*Emi 8

来自官方文档(https://www.typescriptlang.org/docs/handbook/2/type-declarations.html#dts-files):

\n
\n

.d.ts文件是仅包含类型信息的声明文件。这些文件不会产生 .js 输出;它们仅用于类型检查。

\n
\n


Gil*_*ert 6

我想我可以在这里加 2 美分

// somefile.d.ts
export type SomeItem = {
  weight: number
}

export type ItemStorage = {
  name: string
  items: SomeItem[]
}
Run Code Online (Sandbox Code Playgroud)
// somefile.js
// @ts-check
/** @typedef { import('./somefile.d.ts').SomeItem } SomeItem */
/** @typedef { import('./somefile.d.ts').ItemStorage } ItemStorage */

/**
 * @param { StorageItem } item
 */
function doSomething(item) {
  item. // intellisense
  // your code here
}
Run Code Online (Sandbox Code Playgroud)

这样做的巧妙之处在于,我们可以逐渐将类型合并到现有的 javascript 项目中。