gpt4 book ai didi

typescript 。导入 "module/subdirectory"npm 包时未找到环境声明

转载 作者:行者123 更新时间:2023-12-05 05:13:42 25 4
gpt4 key购买 nike

我正在开发一个名为 'vee-type-safe' 的库,用于运行时类型检查。一切都很顺利,直到我添加了一个子目录 /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

我将 "types": "build/index.d.ts" 添加到 package.json

当我在我的包中运行 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' 模块时,没有生成任何错误。我在这里错过了什么?我创建了 a github repo with a bare minimum project to demonstrate this error

最佳答案

当你在外部项目上运行tsc时,vee-type-safetsconfig.json文件没有生效,所以没有强制 tsc 加载 vee-type-safe/declarations/is-iso-date.d.ts。对于 vee-type-safe 的导入,这是可以的,因为 vee-type-safe/package.jsontypes 字段重定向到vee-type-safe/build/index.d.ts,自 vee-type-safe/index 以来,它不引用 is-iso-date。 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. 手动将 vee-type-safe/express(以及您希望其他项目能够导入的每个其他子模块路径)分别重定向到 build 下的正确文件创建一对导入真实路径的 .js.d.ts 文件或带有 main 的 package.json 文件types 引用真实路径的字段。 (更新:看起来 main 就足够了,因为 TypeScript 会尝试更改 main 路径的扩展名。)

参见 this issue以供进一步讨论。

关于 typescript 。导入 "module/subdirectory"npm 包时未找到环境声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53229412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com