【发布时间】:2021-09-27 12:58:14
【问题描述】:
我有以下(简化的)代码:
type GetInput<U> = {
defaultValue?: U
}
const getBool = (input: GetInput<boolean>) => {
return input.defaultValue ?? true
}
const getNumber = (input: GetInput<number>) => {
return input.defaultValue ?? 3;
}
type GetFunc<U> = (input: GetInput<U>) => U;
type ToType<T extends 'boolean' | 'number'> =
T extends 'boolean'
? boolean
: T extends 'number'
? number
: never;
type GlobalGetInput<
T extends 'boolean' | 'number',
U extends ToType<T>
> = {
type: T;
defaultValue?: U;
};
const get = <T extends 'boolean' | 'number', U extends ToType<T>>(input: GlobalGetInput<T, U>) => {
let func: GetFunc<U>;
switch (input.type) {
case 'boolean':
func = getBool;
break;
case 'number':
func = getNumber;
break;
default:
throw new Error('Invalid type')
}
return func({ defaultValue: input.defaultValue })
}
get({ type: 'boolean', defaultValue: true })
运行时可以正常工作,但是在func = getBool; 中输入失败
Type '(input: GetInput<boolean>) => boolean' is not assignable to type 'GetFunc<U>'.
Types of parameters 'input' and 'input' are incompatible.
Type 'GetInput<U>' is not assignable to type 'GetInput<boolean>'.
Type 'U' is not assignable to type 'boolean'.
Type 'ToType<T>' is not assignable to type 'boolean'.
Type 'boolean | (T extends "number" ? number : never)' is not assignable to type 'boolean'.
Type 'T extends "number" ? number : never' is not assignable to type 'boolean'.
Type 'number' is not assignable to type 'boolean'.
Type 'number' is not assignable to type 'boolean'.
Type 'number | boolean' is not assignable to type 'boolean'.
Type 'number' is not assignable to type 'boolean'.
发生这种情况是因为如果在类型参数中传递了字符串boolean,我不知道如何告诉编译器U 只能是boolean 类型。如果它是对象的联合,我们可以使用静态属性进行区分,但对于标量的联合我不知道。
谢谢!
【问题讨论】:
标签: typescript types typescript-generics