似乎在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文件中包含接口,将项目作为普通依赖项导入并显式导入我正在使用的接口?每种方法的优缺点是什么?
答案 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,并以相同的方式导入它。不要神奇地将这些定义添加到环境中(我们有足够的全局变量)