【发布时间】:2020-08-20 09:09:15
【问题描述】:
假设我们有以下函数实现:
type Action = 'GREET' |'ASK'
function getUnion<T extends Action>(action: T) {
switch (action) {
case 'GREET':
return {hello: 'Guten Tag!'} as const
case 'ASK':
return {time: 'Wie spat is es?'} as const
default:
return 'WUT?'
}
}
这个函数的返回类型是下面的联合:
{"WUT?" | { hello: 'Guten Tag!'; time?: undefined; } | { time: 'Wie spat is es?'; hello?: undefined; }}
所以我们可能会想,如果我们通过 switch-case 内部使用的“判别联合”类型的泛型使用函数约束,它将返回特定的分支类型,如下所示:
// ???? NOPE !
// $ExpectType {time: 'Wie spat is es?'}
const t1 = getUnion('ASK')
不幸的是,这是一个不正确的假设,因为我们得到的是整个联合而不是一个狭窄的类型
// ✅$ExpectType {"WUT?" | { hello: 'Guten Tag!'; time?: undefined; } | { time: 'Wie spat is es?'; hello?: undefined; }}
const t1 = getUnion('ASK')
这是正确的行为还是编译器限制?
无论如何,如何解决?
所以const t1 = getUnion('ASK') 将返回{time: 'Wie spat is es?'}?
【问题讨论】:
标签: typescript generics