Компилятор TypeScript заменяет простые выведенные типы случайным импортом зависимостей - PullRequest
3 голосов
/ 30 сентября 2019

Мы видим, как простые выводимые типы, такие как string|number, заменяются типами из зависимостей в наших файлах выходных объявлений ... поэтому string|number превращается в import("csstype").AnimationIterationCountPropert в наших d.ts файлах.

Это вызывает странные, вне контекста имена intellisense и может вызвать проблемы в monorepos, если пакеты с символическими ссылками не имеют доступа к зависимости, которую компилятор TS решает использовать.

Вот пример функции, которая может вернутьстрока или число:

    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. Код, использующий эту библиотеку, не обязательно имеет csstype в своих node_modules, что вызывает ошибку.

  2. В коде потребления мойintellisense при наведении мыши на 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 голосов
/ 01 октября 2019

Похоже, что это ограничение дизайна компилятора TypeScript.

Для типов объединения компилятор будет повторно использовать имя, которое находит для определенной комбинации (?!?).

Благодарим @jcalz за поиск этой проблемы на GitHub: https://github.com/microsoft/TypeScript/issues/30759#issuecomment-480051225

...