我有一个 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”。
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.