【问题标题】:TypeScript compiler replaces simple inferred types with random dependency importsTypeScript 编译器用随机依赖导入替换简单的推断类型
【发布时间】: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 编译器正试图重用它的类型,因为它共享相同的签名?

这会导致两个问题:

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

  2. 在消费代码中,当我将鼠标悬停在 myFunc 上时,我的智能感知说返回类型是 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 tsc


【解决方案1】:

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

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

感谢@jcalz 发现这个 GitHub 问题: https://github.com/microsoft/TypeScript/issues/30759#issuecomment-480051225

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 2021-04-15
    • 1970-01-01
    • 2015-10-03
    • 2020-02-16
    • 1970-01-01
    • 2020-11-06
    • 2018-07-03
    相关资源
    最近更新 更多