由于TypeScript的新手,我对*.d.ts
感到好奇。有人告诉我,这种文件类似于C ++中的“头文件”,但仅适用于JS。但我无法将纯JS文件转换为*.d.ts
文件,除非我强行将*.js
更改为*.ts
。所以我有三个文件:
一个JS文件,一个TS文件和一个*.d.ts
文件。
他们之间的关系是什么?
如何使用*.d.ts
文件?这是否意味着我可以永久删除*.ts
文件?
如果是这样,*.d.ts
文件如何知道哪个JS文件映射到自身?
非常感谢!如果有人能给我一个例子,那将是非常好的。
答案 0 :(得分:206)
“d.ts”文件用于提供有关用JavaScript编写的API的打字稿类型信息。这个想法是你使用的东西,如jQuery或下划线,一个现有的JavaScript库。您想要使用打字稿代码中的那些。
不是重写jquery或下划线或打字稿中的任何内容,而是可以编写d.ts文件,该文件仅包含类型注释。然后从您的打字稿代码中获得静态类型检查的打字稿优势,同时仍然使用纯JS库。
答案 1 :(得分:43)
编译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的大量声明文件集合 库在DefinitelyTyped和Typings 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)的声明文件。
在继续回答此帖子之前需要澄清的几点-
如果您认为打字稿只是语法超集,那么它有什么好处-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”模块时遇到问题。