gpt4 book ai didi

TypeScript 编译器用随机依赖导入替换简单的推断类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:17 25 4
gpt4 key购买 nike

我们看到像 string|number 这样的简单推断类型被依赖类型替换 在我们的输出声明文件中...所以 string|number 在我们的 d.ts 文件中变成了 import("csstype").AnimationIterationCountPropert

这会导致奇怪的、脱离上下文的智能感知名称,并且如果符号链接(symbolic link)包无法访问 TS 编译器决定使用的依赖项,则可能会导致 monorepos 出现问题。

这是一个可以返回字符串或数字的函数示例:

    const myFunc = (test: boolean) => {
let returnString = 'something';
let returnNumber = 1234;
// Returns either string or number
return test ? returnString : returnNumber;
};

TS 推断类型:如果您查看 VSCode 工具提示,该函数的类型是:

(方法)myFunc(测试: bool 值):字符串 |编号

Compiled Declaration: 目前一切看起来都很好。让我们使用 tsc 来编译它。这是 myFunc.d.ts 中的输出:

myFunc(test: boolean): import("csstype").AnimationIterationCountProperty

什么?! 我的源文件甚至没有包含 csstype 也没有提及它。 AnimationIterationCountProperty 碰巧也共享类型 string|number,所以我猜 TS 编译器正试图重新使用它的类型,因为它共享相同的签名?

这会导致 2 个问题:

  1. 使用此库的代码在其 node_modules 中不一定有 csstype,这会导致错误。

  2. 在消费代码中,当我将鼠标悬停在 myFunc 上时,我的 intellisense 说返回类型是 AnimationIterationCountProperty,这在上下文中没有任何意义。此函数与 CSS 类型无关。

这是 TS 编译器的预期行为吗?或者这是某种错误?感谢您的帮助。


附加信息:

  1. typescript 3.6.3

  2. 如果我用返回类型 string|number 显式键入函数,则不会发生这种情况。它输出预期的类型。

  3. 这是我们的 tsconfig:

{
"compilerOptions": {
"module": "es6",
"moduleResolution": "node",
"noImplicitReturns": true,
"incremental": true,
"esModuleInterop": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"rootDir": "src",
"outDir": "lib",
"sourceMap": false,
"strict": true,
"importHelpers": true,
"target": "es2017",
"declaration": true,
"baseUrl": "src",
"jsx": "react"
},
"compileOnSave": true,
"include": ["src/**/*"],
"exclude": ["**/__tests__/**"]
}

最佳答案

这似乎是 TypeScript 编译器的设计限制。

对于联合类型,编译器将重新使用它为特定组合找到的名字 (?!?)。

归功于@jcalz 发现了这个 GitHub 问题: https://github.com/microsoft/TypeScript/issues/30759#issuecomment-480051225

关于TypeScript 编译器用随机依赖导入替换简单的推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58175111/

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