【发布时间】:2020-01-30 04:11:14
【问题描述】:
我们看到像 string|number 这样的简单推断类型被依赖项中的类型替换
在我们的输出声明文件中......所以string|number 在我们的d.ts 文件中变成了import("csstype").AnimationIterationCountPropert。
这会导致奇怪的、脱离上下文的智能感知名称,并且如果符号链接的包无法访问 TS 编译器决定使用的依赖项,则可能会导致 monorepos 出现问题。
这是一个可以返回字符串或数字的函数示例:
const myFunc = (test: boolean) => {
let returnString = 'something';
let returnNumber = 1234;
// Returns either string or number
return test ? returnString : returnNumber;
};
TS 推断类型:如果查看 VSCode 工具提示,则此函数的类型为:
(method) myFunc(test: boolean): string | number
编译声明:到目前为止一切都很好。让我们使用tsc 来编译它。这是myFunc.d.ts中的输出:
myFunc(test: boolean): import("csstype").AnimationIterationCountProperty.
什么?! 我的源文件甚至没有包含csstype 或提及它。 AnimationIterationCountProperty 碰巧也共享类型 string|number,所以我猜 TS 编译器正试图重用它的类型,因为它共享相同的签名?
这会导致两个问题:
使用此库的代码在其 node_modules 中不一定有
csstype,这会导致错误。在消费代码中,当我将鼠标悬停在
myFunc上时,我的智能感知说返回类型是AnimationIterationCountProperty,这在上下文中没有意义。该函数与 CSS 类型无关。
这是 TS 编译器的预期行为吗?或者这是某种错误?感谢您的帮助。
附加信息:
Typescript 3.6.3
如果我明确键入返回类型为
string|number的函数,则不会发生这种情况。它输出预期的类型。这是我们的 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 tsc