消费从JSDoc生成的类型声明:TS7016

时间:2019-11-23 08:25:44

标签: typescript jsdoc

我正在使用a library called bexer在一个monorepo中编写包含许多软件包(@bexer/*)的https://lerna.js.org
每个包都包含在JSDoc注释内定义的打字稿类型。
任务是在使用我的库的项目中使用这些类型。

  1. 我假设必须生成类型声明(*.d.ts),该声明将被目标项目使用。
  2. 我用typescript@3.7.3-insiders.20191118和以下tsconfig.json生成类型声明:
{
  "compilerOptions": {

    "noEmit": false,
    "declaration": true,
    "emitDeclarationOnly": true,
    "declarationDir": "./packages/bexer-types",

    "noImplicitAny": true,
    "strictNullChecks": true,
    "allowJs": true,
    "checkJs": true,

    "target": "ESNext",
    "moduleResolution": "Node"
  },
  "types": [
    "chrome"
  ],
  "include": [
    "./packages/**/*"
  ],
  "exclude": [
    "./packages/rollup.config.js",
    "./packages/**/iife/*",
    "./packages/bexer-types/bexer-*"
  ]
}
  1. 在目标项目中,我使用以下tsconfig.json
{
  "compilerOptions": {
    "noEmit": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "allowJs": true,
    "checkJs": true,

    "target": "ESNext",
    "moduleResolution": "Node"
  },
  "types": [
    "chrome"
  ],
  "include": [
    "./src/**/*",
    "./node_modules/@bexer/components/**/*",
    "./node_modules/@bexer/types/**/*"
  ],
  "exclude": [
    "./node_modules/@bexer/**/iife",
    "./node_modules/@bexer/types/node_modules"
  ]
}
  1. 在目标项目中启动tsc后,出现以下错误:
  

node_modules/@bexer/types/bexer-index/esm/index.d.ts:18:24-错误TS7016:找不到模块'@ bexer / utils'的声明文件。 '/home/ilyaigpetrov/Projects/bexer/packages/bexer-types/node_modules/@bexer/utils/esm/index.js'隐式地具有“ any”类型。
    如果存在,请尝试npm install @types/bexer__utils或添加一个包含declare module '@bexer/utils';

的新声明(.d.ts)文件。      

从“ @ bexer / utils”以实用程序的形式导入18 *;

因此,index.d.ts中的types/bexer-index的导入方式如下:
import * as Utils from "@bexer/utils";无法在@bexer/types/bexer-utils/esm/index.d.ts处找到类型声明,并且TypeScript建议将declare module '@bexer/utils';添加到声明文件中。

但是,手动将declare module...置于@bexer/types/bexer-utils/esm/index.d.ts并不能消除该错误。

我的问题:

  1. 我生成类型声明的方法是从JSDoc使用类型的正确方法吗?
  2. 在目标项目中使用生成的@ bexer / types的正确方法是什么?

UPD : 在目标项目中,我有globals.d.ts的内容:

interface Window {
  Bexer: typeof import('@bexer/types/bexer-index/esm/index')
}

1 个答案:

答案 0 :(得分:0)

我找到的唯一解决方案是:

  1. 不要将所有类型声明作为单独的包发布,而仅将共享类型声明作为单独的包发布。
  2. 将类型声明放入每个已发布的软件包中:例如@bexer/index/esm/index.js应该与@bexer/index/esm/index.d.ts一起陪伴。