TL;DR:我们希望存储库中的多个文件有一个类型文件
我们有一个内部的javascript库,我们试图添加类型。这个javascript库不捆绑它的文件,所以它们是这样导入的:
import someModule from '@org/some/module/path';
import otherModule from '@org/some/module/other';
到目前为止,我们已经通过创建一个类型声明文件(typings.d.ts
(并将该文件放在打字稿项目的根目录中取得了成功:
typings.d.ts
declare module '@org/some/module/path' {
export default function someModule(): string;
}
declare module '@org/some/module/other' {
export default function otherModule(): string;
}
但是由于我们对 TypeScript 越来越认真,我们希望将此类型文件移动到该库中(而不是在导入库的存储库中(,以便这些类型可以存在于该库的存储库中并在未来的打字稿项目中重复使用。
我尝试的是将typings.d.ts
文件移动到内部存储库,并将密钥"types": "./typings.d.ts"
添加到存储库的包中.json
发布后,我仍然收到以下错误:
Could not find a declaration file for module '@sift/skipper/components/Loader'
我错过了什么吗?有什么想法吗?
你不走运; 如果要使导入在每个使用该库的项目中无需特殊配置即可工作,则需要在每个.js
文件旁边创建一个.d.ts
文件。
根据我的实验,TypeScript 加载项目的算法大致是这样的(其他人可以随意提供更正(:
- 加载由
files
、include
和exclude
字段以及tsconfig.json
中的types
选项指定的所有源文件。 对于每个加载的文件,请遵循<reference>
指令并尝试使用模块解析跟踪模块导入,但如果模块解析失败,请不要报告错误。 - 列出看到的所有模块声明(
declare module "foo" { ... }
(。 - 重新访问每个模块导入以将其与实际模块相关联:如果看到模块声明,则使用它,否则如果模块解析找到作为外部模块的文件,则使用它,否则报告错误。
(好奇的旁注:这意味着如果步骤 1 中的导入加载了带有全局声明的非模块文件,即使导入最终与模块声明而不是文件相关联,这些全局声明仍然有效!
以前,typings.d.ts
文件作为原始项目的源文件之一加载。 但是现在,没有任何内容强制加载库中的typings.d.ts
文件,并且'@sift/skipper/components/Loader'
的模块解析正在查找.js
文件旁边的.d.ts
文件,并且不存在。package.json
的types
字段仅在加载包的根目录(通过导入或types
选项或<reference types="..."/>
(时才起作用;这不是查找包的所有子模块的类型声明的通用方法。
您的其他选择(大致按非常规递增的顺序(是让主项目使用库typings.d.ts
<reference path="..."/>
,将库的typings.d.ts
添加到主项目tsconfig.json
的files
或include
字段中,或者使用typeRoots
和types
强制加载库包的根目录。