🔎 搜索词
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
5条答案
按热度按时间siotufzp1#
我没有详细说明可能导致这个问题的原因,因为在一般情况下,pnpm已经修复了这个问题,但我坦率地说,我不知 prop 体是什么原因。然而,这个仓库并不大,包含了重现错误所需的所有内容。
我怀疑这个问题与
npm link
有关,因为当通过tarball简单安装库时,它可以正常工作。nbysray52#
这与
npm link
没有关系 - 只是我们没有在@privateprefix/lib
中看到Joi
类型的重新导出,作为一种自动生成的引用joi
内部的方式。因此,当你明确地将别名导入到Joi
时,它才能正常工作。(tarball安装之所以有效,是因为npm
将安装提升到顶层,而不是像link
那样进行严格的依赖嵌套。)我们确实会查找一些重新导出,但通常我们寻找的是完整的重新导出,其中一个模块通过export =
是另一个模块 - 像这样的嵌套重新导出,你导入一个默认值并将其作为命名成员重新导出,我认为这不是我们在寻找可访问名称的模块时当前遍历的别名。所以这个是可以修复的,但是逻辑可能会有点奇怪,因为我们将在...基本上每个符号名的任何地方(而不仅仅是可达的文件名)寻找模块符号别名。ldfqzlk83#
感谢 @weswigham 的回答。作为一个有抱负的编译器技术员,我实际上完全理解,并诚实地说有点惊讶,因为通过 #42873 解决了类似的问题,所以这给了我希望,也许这个问题也能以某种方式解决。
这个问题在我工作中出现了,虽然我显然不能透露细节,但情况(和问题)几乎完全相同。最让我沮丧的是,我们过去只使用 JavaScript + JSDoc,并简单地对所有文件进行 TypeScript 检查。现在我们正过渡到全 TypeScript,这突然成了一个问题。这令人困惑,令人沮丧。
我必须尝试检查,如果问题在最小仓库中仍然存在,如果文件是 JS+JSDoc+自动生成的 Typescript 声明文件,但我怀疑问题在那里不会存在。
这再次令人沮丧,因为我们有很多仓库,通过发布的 npm-packages 使用它们工作得很好(即 tarball 工作),但在开发过程中手动链接这些包在一起,使开发更容易,现在却出了问题:/
des4xlb04#
我在一个5.5(
"moduleResolution": "Node16"
)的monorepo中遇到了类似的问题,一个包重新导出了io-ts。我们从
* as t
模块中导入了transient-module
中的一个类型。我可以通过import "monorepo-package/transient-module"
和Foo
一起解决这个问题,但这远非理想状态。如果这不是预期的结果,或者不清楚为什么会发生这种情况,我可以尝试提出一个简单的复现方法。
h4cxqtbf5#
我必须尝试检查,如果问题在最小仓库中仍然存在,如果文件是 JS+JSDoc+自动生成的 Typescript 声明文件,但我怀疑在那里不会出现这个问题。
正如我在这里承诺的那样,过了一段时间,我在原始引用项目 jsdoc-branch 中做了必要的更改。
我还将预期的 typescript 版本更新为一个更新的
5.5.3
。在新分支main
上,这个问题仍然存在(如预期),但在新分支jsdoc
上,情况对我来说是相同的,除了源代码是 javascript,使用 jsdoc 进行类型注解。我相信产生的声明文件应该是相同的,尽管我承认我没有检查过。我的问题实际上是,你能解释为什么吗?在工作中,多年来我一直想从 javascript (+jsdoc) 转向真正的 typescript,因为我看到使用 just typescript 有很多好处,但出于某种原因,我们出现了这样的问题.. "突然出现"?基本上相同的源代码和相同的 typescript-configuration 文件,只是从 javascript 切换到 typescript。
我认为迁移会更容易。