使用从 JSDoc 生成的类型声明:TS7016

Posted

技术标签:

【中文标题】使用从 JSDoc 生成的类型声明:TS7016【英文标题】:Consuming types declarations generated from JSDoc: TS7016 【发布时间】:2020-03-19 05:03:53 【问题描述】:

我正在使用https://lerna.js.org 在一个monorepo 中写a library called bexer 和许多包(@bexer/*)。 每个包都包含在 JSDoc cmets 中定义的 typescript 类型。 任务是在使用我的库的项目中使用这些类型。

    我认为我必须生成将被目标项目使用的类型声明 (*.d.ts)。 我使用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-*"
  ]

    在目标项目中,我使用以下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"
  ]

    在目标项目中启动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)文件

18 import * as Utils from "@bexer/utils";

所以来自types/bexer-indexindex.d.ts 具有如下导入: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 并不能消除此错误。

我的问题:

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

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

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


【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用从 JSDoc 生成的类型声明:TS7016的主要内容,如果未能解决你的问题,请参考以下文章

ts(7016) 找不到模块“cloudinary-react”的声明文件。如果存在,请尝试 `npm i --save-dev @types/cloudinary-react` 或添加新的...?

WebStorm JSDoc 类声明,用于使用 node.js 模块完成代码

JSDoc Typescript声明:如何隐藏“私有”方法

使用 JSDoc 给 js 项目添加类型注释

处理未定义声明文件 (index.d.ts) 的正确方法

从 OpenAPI 规范生成 JSDoc