如何在多文件/ es-style-imports JavaScript存储库中添加类型?

时间:2018-10-24 19:18:42

标签: typescript typescript-typings

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"添加到仓库的package.json中。

发布后,我仍然收到以下错误:

Could not find a declaration file for module '@sift/skipper/components/Loader'

我想念什么吗?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你不走运;如果要在使用该库的每个项目中进行导入而无需进行特殊配置,则需要在每个.d.ts文件旁边创建一个.js文件。

根据我的实验,TypeScript加载项目的算法大致如下所示(其他人可以随时做出更正):

  1. 加载filesincludeexclude字段以及types中的tsconfig.json选项指定的所有源文件。对于每个加载的文件,请遵循<reference>指令,并尝试使用module resolution来遵循模块导入,但是如果模块解析失败,请不要报告错误。
  2. 列出所有可见的模块声明(declare module "foo" { ... }
  3. 重新访问每个模块导入,以将其与实际模块相关联:如果看到了模块声明,则使用它,否则,如果模块解析找到了一个外部模块文件,则使用它,否则报告错误。

(好奇的旁注:这意味着如果第1步中的导入使用全局声明加载了一个非模块文件,则即使该导入最终与模块声明而不是文件相关联,这些全局声明仍然有效!)

以前,您的typings.d.ts文件已作为原始项目的源文件之一加载。但是现在,什么也没有强制加载库中的typings.d.ts文件,并且'@sift/skipper/components/Loader'的模块分辨率正在与.d.ts文件一起寻找.js文件,没有一个存在。 types的{​​{1}}字段仅在您加载软件包的根目录时才起作用(通过导入或package.json选项或types);这不是为包的所有子模块查找类型声明的通用方法。

您的其他选择(按非常规的顺序,从大到小的顺序排列)是将主项目使用<reference types="..."/>到库的<reference path="..."/>,将库的typings.d.ts添加到{{1} }或主项目typings.d.ts的{​​{1}}字段,或使用filesinclude强制加载库包的根。