Typescript 如何向多文件/es样式导入javascript repo添加打字?

Typescript 如何向多文件/es样式导入javascript repo添加打字?,typescript,typescript-typings,Typescript,Typescript Typings,TL;DR:我们需要一个打字文件来处理repo中的多个文件 我们有一个内部javascript库,我们正在尝试向其中添加类型。此javascript库不绑定其文件,因此它们将按如下方式导入: import someModule from '@org/some/module/path'; import otherModule from '@org/some/module/other'; 到目前为止,我们已经成功地创建了一个typings声明文件(typings.d.ts),并将该文件放在我们的

TL;DR:我们需要一个打字文件来处理repo中的多个文件


我们有一个内部javascript库,我们正在尝试向其中添加类型。此javascript库不绑定其文件,因此它们将按如下方式导入:

import someModule from '@org/some/module/path';
import otherModule from '@org/some/module/other';
到目前为止,我们已经成功地创建了一个typings声明文件(
typings.d.ts
),并将该文件放在我们的typescript项目的根目录下:

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越来越认真,我们希望将这个打字文件移动到该库中(而不是在导入库的repo中),以便这些打字可以存在于该库的repo中,并在未来的TypeScript项目中重复使用


我尝试的是将
typings.d.ts
文件移动到内部repo,并将键
“types”:“/typings.d.ts”
添加到repo的package.json

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

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


我错过什么了吗?有什么想法吗?

你运气不好;如果要使导入在使用库的每个项目中不进行特殊配置的情况下工作,则需要在每个
.js
文件旁边创建一个
.d.ts
文件

根据我的实验,TypeScript加载项目的算法大致如下(其他人可以随意修改):

  • 加载由
    文件
    包含
    排除
    字段以及
    tsconfig.json中的
    类型
    选项指定的所有源文件。对于每个加载的文件,遵循
    指令并尝试使用跟踪模块导入,但如果模块解析失败,则不要报告错误
  • 列出所看到的所有模块声明(
    声明模块“foo”{…}
  • 重新访问每个模块导入以将其与实际模块关联:如果看到模块声明,则使用它,否则如果模块解析发现一个文件是外部模块,则使用它,否则报告错误
  • (请注意:这意味着如果步骤1中的导入加载了带有全局声明的非模块文件,则即使导入最终与模块声明而不是文件关联,这些全局声明仍然有效!)

    以前,您的
    typings.d.ts
    文件已作为原始项目的源文件之一加载。但是现在,没有任何东西强迫加载库中的
    typings.d.ts
    文件,而
    '@sift/skipper/components/Loader'
    的模块解析在
    .js
    文件旁边查找
    .d.ts
    文件,但不存在。
    package.json的
    types
    字段仅在加载包的根目录(通过导入或
    types
    选项或
    )时起作用;这不是为包的所有子模块查找类型声明的一般方法


    您的其他选择(以非常规性的大致递增顺序)是将主项目使用
    添加到库的
    typings.d.ts
    ,将库的
    typings.d.ts
    添加到
    文件中
    或主项目的
    tsconfig.json
    include
    字段中,或者使用
    typeroot
    types
    强制加载库包的根。

    谢谢您的回答!肯定有帮助!我发现,
    import'@sift/skipper/typings'工作(库的根目录中有文件
    typings.d.ts
    )。我并不讨厌它的样子,但现在我怀疑它有多不传统。你怎么认为?这有多奇怪?这很不传统,但如果你对自己的项目没意见,那就好了。TypeScript的设计使得包可以通过将
    .d.ts
    文件与
    .js
    文件放在一起,无缝地捆绑自己的类型声明,调用方不必做任何事情,只需导入它实际想要使用的模块。许多软件包都这样做。我从未见过另一个软件包期望调用者进行单独的导入以获得类型声明,尽管我见过一个软件包(KendoUI),它期望开发人员在别处下载
    .d.ts
    并将其添加到他们的项目中。