繁体   English   中英

打字稿。 导入“模块/子目录”npm 包时找不到环境声明

[英]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-safetsconfig.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文件。

您有几个选项可以解决此问题,但都不是很好:

  1. (已删除)
  2. 让外部项目导入vee-type-safe/build/express ,它将解析为vee-type-safe/build/express/index.d.ts
  3. vee-type-safe删除outDir选项,以便.d.ts文件与.ts文件一起生成。
  4. 通过手动创建一对.js.d.ts文件来导入真实的文件,将vee-type-safe/express (以及您希望其他项目能够导入的每个其他子模块路径)单独重定向到build下的正确文件路径或包含引用真实路径的maintypes字段的package.json文件。 (更新:看起来main就足够了,因为 TypeScript 会尝试更改main路径的扩展名。)

有关其他讨论,请参阅此问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM