TypeScript 在使用npm link手动链接包时,"无法在没有引用Y的情况下命名X的推断类型"(TS2742)问题仍然存在,

busg9geu  于 2个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(42)

🔎 搜索词

is:issue is:open 2742

🕗 版本与回归信息

这似乎不是一个回归错误

⏯ Playground链接

https://github.com/Teascade/typescript-error-demonstration

💻 代码

// In the example provided
// https://github.com/Teascade/typescript-error-demonstration

import { extended } from '@privateprefix/lib';

// src/index.ts(4,14): error TS2742: The inferred type of 'a' cannot be named without a reference to '@privateprefix/lib/node_modules/joi'. This is likely not portable. A type annotation is necessary.
export const a = extended.object().keys();

// Joi is declared, but never used ts(6133)
import { type Joi, extended } from '@privateprefix/lib';

// This works now, though
export const a = extended.object().keys();

替换这个

🙁 实际行为

产生 src/index.ts(4,14): error TS2742: The inferred type of 'a' cannot be named without a reference to '@privateprefix/lib/node_modules/joi'. This is likely not portable. A type annotation is necessary.

🙂 预期行为

不期望出现错误

关于问题的附加信息

在 #42873 (评论)中提到,这个问题现在将在 TypeScript beta 5.5.0 中得到解决,但在这个特定的情况下似乎仍然存在问题。我创建了一个最小的仓库来解决这个问题 https://github.com/Teascade/typescript-error-demonstration。GitHub 仓库中有一个 GitHub action,其中可以重现这个问题:https://github.com/Teascade/typescript-error-demonstration/actions/runs/9568149578/job/26377636108

siotufzp

siotufzp1#

我没有详细说明可能导致这个问题的原因,因为在一般情况下,pnpm已经修复了这个问题,但我坦率地说,我不知 prop 体是什么原因。然而,这个仓库并不大,包含了重现错误所需的所有内容。
我怀疑这个问题与npm link有关,因为当通过tarball简单安装库时,它可以正常工作。

nbysray5

nbysray52#

这与npm link没有关系 - 只是我们没有在@privateprefix/lib中看到Joi类型的重新导出,作为一种自动生成的引用joi内部的方式。因此,当你明确地将别名导入到Joi时,它才能正常工作。(tarball安装之所以有效,是因为npm将安装提升到顶层,而不是像link那样进行严格的依赖嵌套。)我们确实会查找一些重新导出,但通常我们寻找的是完整的重新导出,其中一个模块通过export =是另一个模块 - 像这样的嵌套重新导出,你导入一个默认值并将其作为命名成员重新导出,我认为这不是我们在寻找可访问名称的模块时当前遍历的别名。所以这个是可以修复的,但是逻辑可能会有点奇怪,因为我们将在...基本上每个符号名的任何地方(而不仅仅是可达的文件名)寻找模块符号别名。

ldfqzlk8

ldfqzlk83#

感谢 @weswigham 的回答。作为一个有抱负的编译器技术员,我实际上完全理解,并诚实地说有点惊讶,因为通过 #42873 解决了类似的问题,所以这给了我希望,也许这个问题也能以某种方式解决。

这个问题在我工作中出现了,虽然我显然不能透露细节,但情况(和问题)几乎完全相同。最让我沮丧的是,我们过去只使用 JavaScript + JSDoc,并简单地对所有文件进行 TypeScript 检查。现在我们正过渡到全 TypeScript,这突然成了一个问题。这令人困惑,令人沮丧。

我必须尝试检查,如果问题在最小仓库中仍然存在,如果文件是 JS+JSDoc+自动生成的 Typescript 声明文件,但我怀疑问题在那里不会存在。

这再次令人沮丧,因为我们有很多仓库,通过发布的 npm-packages 使用它们工作得很好(即 tarball 工作),但在开发过程中手动链接这些包在一起,使开发更容易,现在却出了问题:/

des4xlb0

des4xlb04#

我在一个5.5("moduleResolution": "Node16")的monorepo中遇到了类似的问题,一个包重新导出了io-ts。

error TS2742: The inferred type of 'Foo' cannot be named without a reference to '../../../node_modules/monorepo-package/transient-module.js'. This is likely not portable. A type annotation is necessary.

export const Foo = t.etc({
             ~~~

我们从* as t模块中导入了transient-module中的一个类型。我可以通过import "monorepo-package/transient-module"Foo一起解决这个问题,但这远非理想状态。
如果这不是预期的结果,或者不清楚为什么会发生这种情况,我可以尝试提出一个简单的复现方法。

h4cxqtbf

h4cxqtbf5#

我必须尝试检查,如果问题在最小仓库中仍然存在,如果文件是 JS+JSDoc+自动生成的 Typescript 声明文件,但我怀疑在那里不会出现这个问题。
正如我在这里承诺的那样,过了一段时间,我在原始引用项目 jsdoc-branch 中做了必要的更改。
我还将预期的 typescript 版本更新为一个更新的 5.5.3 。在新分支 main 上,这个问题仍然存在(如预期),但在新分支 jsdoc 上,情况对我来说是相同的,除了源代码是 javascript,使用 jsdoc 进行类型注解。我相信产生的声明文件应该是相同的,尽管我承认我没有检查过。
我的问题实际上是,你能解释为什么吗?在工作中,多年来我一直想从 javascript (+jsdoc) 转向真正的 typescript,因为我看到使用 just typescript 有很多好处,但出于某种原因,我们出现了这样的问题.. "突然出现"?基本上相同的源代码和相同的 typescript-configuration 文件,只是从 javascript 切换到 typescript。
我认为迁移会更容易。

相关问题