使用TypeScript声明(* .d.ts)和接口的正确方法是什么?

时间:2017-06-13 02:49:45

标签: typescript typescript-typings

似乎在TypeScript中有两种使用接口的方法:我可以在普通的.ts文件中定义它们并导入它们,或者我可以在.d.ts文件中定义它们并让编译器自动从node_modules /中发现它们@types或通过在tsconfig.json中添加相关路径到typeRoots,它们在任何地方都“神奇地”可用。

目前我有两个项目:客户端(React)和服务器(Express),都是用TypeScript编写的。我在两个项目中都使用了某些接口,为了避免项目之间的依赖关系,我将公共接口提取到一个单独的项目到声明文件中。然后我以这种方式将项目添加为dev依赖项:

"@types/my-definitions": "git+ssh://git@github.com/myaccount/my-definitions.git"

这样TypeScript编译器会自动从node_modules / @ types中找到接口,而不必导入接口。

我的问题是,这是一个很好的做法,还是我应该在普通.ts文件中包含接口,将项目作为普通依赖项导入并显式导入我正在使用的接口?每种方法的优缺点是什么?

1 个答案:

答案 0 :(得分:0)

根据您的.d.ts文件生成

.ts个文件作为打字稿项目的输出(以及编译的JS)。

通常这些是通过导入引入的,而不是通过神奇地发现它们,因为它们位于特别命名的文件夹中。

当您使用由DOM / BOM / NodeJS定义的环境JS全局变量时,您希望将.d.ts放在该神奇文件夹中以便所有代码可用的时间。您不需要显式导入它们,它们始终可用(就像它们在JavaScript中一样)

然而,当处理实际的库(输出JavaScript代码)时。您应该通过package.json导入库并配置TypeScript以通过查看node_modules来解析模块。

示例

致电document.createElement()会返回HTMLElement。通过添加环境定义,您不必导入document对象。

但是,假设您正在使用Angular,当您想要使用角度类时,您必须明确地导入它

import {Component} from "@angular/core"

TypeScript将知道在ts中查找node_modules/@angular/core个文件。它可能是原始的.ts但通常不会打包为TypeScript项目的输出,通常只会获得已编译的JS和.d.ts文件。

<强>摘要

您应该将可重复使用的代码视为第三方库,例如angular,并以相同的方式导入它。不要神奇地将这些定义添加到环境中(我们有足够的全局变量)