我有一个 Map ,一一对应。
TAP_TYPE.LOCAL 对应 TAP_LOCAL,
TAP_TYPE.MAP 对应 TAP_MAP。
我在函数中已经通过 switch 约束 test 的 v, 为什么 ts 还是推导 v 的类型是 TAP_LOCAL | TAP_MAP ?
或者对这样的例子,除了对 v 进行强制断言,有什么更好的写法吗?
enum TAP_TYPE {
'LOCAL',
'MAP',
}
interface TAP_LOCAL {
a: string;
}
interface TAP_MAP {
b: string;
}
type TapTypeMap = {
[TAP_TYPE.LOCAL]: TAP_LOCAL;
[TAP_TYPE.MAP]: TAP_MAP;
};
function test<T extends TAP_TYPE>(t: T, v: TapTypeMap[T]) {
switch (t) {
case TAP_TYPE.LOCAL:
return v.a; // 类型错误 类型“TAP_LOCAL | TAP_MAP”上不存在属性“a”。
case TAP_TYPE.MAP:
return v.b; // 类型错误 类型“TAP_LOCAL | TAP_MAP”上不存在属性“b”。
}
}