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

TypeScript编译器用随机依赖项导入替换简单的推断类型,typescript,tsc,Typescript,Tsc,我们看到像string | number这样的简单推断类型被依赖项中的类型所取代 在我们的输出声明文件中。。。因此string | number在我们的d.ts文件中变成import(“csstype”).AnimationIterationCountPropert 这会导致奇怪的、脱离上下文的intellisense名称,并且如果符号链接包无法访问TS编译器决定使用的依赖项,则可能会在monorepos中引起问题 下面是一个可以返回字符串或数字的函数示例: const myFunc =

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

这会导致奇怪的、脱离上下文的intellisense名称,并且如果符号链接包无法访问TS编译器决定使用的依赖项,则可能会在monorepos中引起问题

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

    const myFunc = (test: boolean) => {
      let returnString = 'something';
      let returnNumber = 1234;
      // Returns either string or number
      return test ? returnString : returnNumber;
    };
TS推断类型:如果检查VSCode工具提示,此函数的类型为:

(方法)myFunc(测试:布尔):字符串|数字

编译声明:到目前为止,一切看起来都很好。让我们使用
tsc
来编译这个。以下是
myFunc.d.ts
中的输出:

myFunc(测试:布尔):导入(“csstype”).AnimationIterationCountProperty

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

这会导致两个问题:

  • 使用此库的代码的节点_模块中不一定有
    csstype
    ,这会导致错误

  • 在消费代码中,当我将鼠标移到
    myFunc
    上时,我的intellisense显示返回类型为
    AnimationIterationCountProperty
    ,这在上下文中没有意义。此函数与CSS类型无关

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


    其他信息:

  • 打字稿3.6.3

  • 如果我使用返回类型
    string | number
    明确地键入函数,则不会发生这种情况。它输出预期的类型

  • 这是我们的tsconfig:


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

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

    @jcalz发现了这个GitHub问题:

    嗯,看起来很不错,很好的发现。那太疯狂了。
    {
      "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__/**"]
    }