Указанное c сообщение об ошибке:
Это условие всегда будет возвращать «ложь», поскольку типы «DeepPartial » и «[число | строка | логическое значение | bigint | символ]» 'не перекрываются.
Это очень похоже на сообщение об ошибке, которое вы получите для всех, кроме последнего оператора if
при определении функции как function test<T>(o: T)
:
Это условие всегда будет возвращать «ложь», поскольку типы «T» и «[число | строка | логический | bigint | символ]» не перекрываются.
Поскольку тип не был вначале распознается, что тип T
является непрозрачным типом в теле test()
, поэтому его следует рассматривать как unknown
, а не any
.
Для T
нетипично ссылаться на неоднородная смесь типов, так что если это то, что вам нужно, то, вероятно, я бы предложил такой подход:
const enum Test {
ONE,
STRING,
FALSE,
BIG_ONE,
HAS_INSTANCE,
TWO,
UNKNOWN
}
type TestMap<T> = T extends 1 ? Test.ONE
: T extends '' ? Test.STRING
: T extends false ? Test.FALSE
: T extends 1n ? Test.BIG_ONE
: T extends SymbolConstructor['hasInstance'] ? Test.HAS_INSTANCE
: T extends 2 ? Test.TWO
: Test.UNKNOWN;
function test<T>(o: T): TestMap<T> {
function testImpl(o: any): Test {
if (o === 1) return Test.ONE;
if (o === '') return Test.STRING;
if (o === false) return Test.FALSE;
if (o === 1n) return Test.BIG_ONE;
if (o === Symbol.hasInstance) return Test.HAS_INSTANCE;
if (o === 2) return Test.TWO;
return Test.UNKNOWN;
}
return testImpl(o) as TestMap<T>;
}