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

时间:2019-09-30 20:47:11

标签: typescript tsc

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

这会导致奇怪的上下文智能名称,如果符号链接的程序包无法访问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编译器正在尝试重用其类型,因为它共享相同的签名?

这会导致2个问题:

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

  2. 在使用代码中,当我将鼠标悬停在myFunc上时,我的智能提示说返回类型为AnimationIterationCountProperty,这在上下文中没有意义。此功能与CSS类型无关。

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


其他信息:

  1. 打字稿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__/**"]
}

1 个答案:

答案 0 :(得分:0)

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

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

使用@jcalz来查找此GitHub问题: https://github.com/microsoft/TypeScript/issues/30759#issuecomment-480051225