[英]TypeScript. Ambient declaration was not found when importing "module/subdirectory" npm package
我正在开发一个名为'vee-type-safe'
的库,用于运行时类型检查。 一切都很/express/index.ts
,直到我添加了一个子目录/express
和一个文件/express/index.ts
,我在其中导出了一些ExpressJS
中间件类型检查工厂。 所以我有以下结构:
vee-type-safe
|- build
|- package.json
|- declarations
| |- is-iso-date.d.ts
|
|- tsconfig.json
|- index.ts // lightweight core library
|- express
|-index.ts // express middleware factories
在express/index.ts
文件中,我导入了我的库核心'../index.ts'
模块。 在我的核心模块中,我有以下导入:
import isISODate = require('is-iso-date');
'is-iso-date'
包没有类型,所以我用is-iso-date.d.ts
创建了declarations
目录,就像这样简单:
declare module 'is-iso-date' {
function isISODate(suspect: string): boolean;
export = isISODate;
}
我添加了"typeRoots": [ ..., "declarations"]
到tsconfig.json
我在package.json
添加了"types": "build/index.d.ts"
当我在我的包中运行tsc
,一切编译都没有错误。 但是当我通过 npm 安装我的'vee-type-safe'
库作为某个项目的依赖项并尝试编译它时,我收到以下错误:
Could not find a declaration file for module 'is-iso-date'.
'/home/tegeran/projects/is-iso-date-issue/node_modules/is-iso-date/index.js'
implicitly has an 'any'type.
Try `npm install @types/is-iso-date` if it exists or add a new declaration (.d.ts)
file containing `declare module 'is-iso-date';`
1 import isISODate = require('is-iso-date');
仅当我导入'vee-type-safe/express'
子模块时才会发生这种情况。 当我导入我的核心'vee-type-safe'
模块时,不会产生任何错误。 我在这里缺少什么? 我用最少的项目创建了一个 github repo 来演示这个错误
在外部项目上运行tsc
时, vee-type-safe
的tsconfig.json
文件无效,因此没有强制tsc
加载vee-type-safe/declarations/is-iso-date.d.ts
。 对于进口vee-type-safe
,这是可以的,因为types
的领域vee-type-safe/package.json
重定向到vee-type-safe/build/index.d.ts
,这并不是指is-iso-date
因为vee-type-safe/index.ts
仅在实现中使用is-iso-date
并且不从中公开任何类型。 但是,导入vee-type-safe/express
绕过vee-type-safe/package.json
并直接加载vee-type-safe/express/index.ts
,该文件导入vee-type-safe/index.ts
, 导入is-iso-date
,您会收到错误消息。 更重要的是, vee-type-safe/express
的导入在运行时不起作用,因为它不会解析为.js
文件。
您有几个选项可以解决此问题,但都不是很好:
vee-type-safe/build/express
,它将解析为vee-type-safe/build/express/index.d.ts
。vee-type-safe
删除outDir
选项,以便.d.ts
文件与.ts
文件一起生成。.js
和.d.ts
文件来导入真实的文件,将vee-type-safe/express
(以及您希望其他项目能够导入的每个其他子模块路径)单独重定向到build
下的正确文件路径或包含引用真实路径的main
和types
字段的package.json
文件。 (更新:看起来main
就足够了,因为 TypeScript 会尝试更改main
路径的扩展名。)有关其他讨论,请参阅此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.