使用从 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-index
的index.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` 或添加新的...?