Мы видим, как простые выводимые типы, такие как 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 проблемы:
Код, использующий эту библиотеку, не обязательно имеет csstype
в своих node_modules, что вызывает ошибку.
В коде потребления мойintellisense при наведении мыши на myFunc
говорит, что тип возвращаемого значения - AnimationIterationCountProperty
, что не имеет смысла в контексте. Эта функция не имеет ничего общего с типами CSS.
Это предполагаемое поведение компилятора TS? Или это какая-то ошибка? Спасибо за любую помощь.
Дополнительная информация:
Машинопись 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__/**"]
}