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

时间:2014-01-21 01:05:16

标签: typescript .d.ts

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


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

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

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


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

8 个答案:

答案 0 :(得分:206)

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

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

答案 1 :(得分:43)

d代表declaration files

  

编译TypeScript脚本时,有一个生成选项   一个声明文件(扩展名为.d.ts),作为一个   编译JavaScript中的组件的接口。进行中   编译器剥离所有函数和方法体并保留   仅导出的类型的签名。所结果的   然后可以使用声明文件来描述导出的虚拟   第三方时,JavaScript库或模块的TypeScript类型   开发人员从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一样。

     

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

答案 2 :(得分:26)

我无法评论,因此将其添加为答案。尝试将现有类型映射到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{}

答案 3 :(得分:6)

此答案假定您具有一些不想转换为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

答案 4 :(得分:5)

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

在继续回答此帖子之前需要澄清的几点-

  1. Typescript是javascript的语法超集。
  2. Typescript不能独立运行,需要转换为javascript(typescript to javascript conversion
  3. “类型定义”和“类型检查”是Typescript通过javascript提供的主要附加功能。 (check difference between type script and 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库代码和打字稿项目之间的接口。

答案 5 :(得分:1)

实际示例(针对特定案例):

假设您要通过 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;
}

答案 6 :(得分:0)

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

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

export type ItemStorage = {
  name: string
  items: SomeItem[]
}
// simefile.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
}

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

答案 7 :(得分:-1)

例如,您在使用 npm 中的“alertifyjs”模块时遇到问题。

  1. 创建“anyNameYoulike.d.ts”(例如,您在 src 文件夹中创建了此文件)
  2. 在文件中 声明模块'alertifyjs'; enter image description here
  3. 在 tsconfig.json 中 在“编译器选项”下 "typeRoots": ["node_modules/@types", "src/anyNameYoulike.d.ts"]