对不起的标题,对不起,但我真的不知道该怎么称呼。
我有一个枚举,我想将每个枚举项匹配到一个类型。我这样做是为了使函数的参数可以根据第一个参数动态更改。一个例子:
enum Enum {
A,
B,
C
}
interface TypeMap {
[Enum.A]: number,
[Enum.B]: string,
[Enum.C]: boolean
}
function doSomething<K extends Enum>(a: K, b: TypeMap[K]) {
//
}
例如,当呼叫 doSomething
时类型系统可以正常工作,例如:doSomething(Enum.A, 5)
有效,但是doSomething(Enum.A, "hello")
无效。但是,我无法工作的是:
function doSomething<K extends Enum>(a: K, b: TypeMap[K]) {
if (a === Enum.A) {
let num: number = b;
}
}
打字稿在分配给num
时出错,但显然,它应该可以工作。如果a
为Enum.A
,那么b
必须按定义为number
,对吗?我究竟做错了什么?我如何使它工作?
function isA(a: Enum, b: any): b is TypeMap[Enum.A] {
return a === Enum.A
}
//function isB
//function isC
function doSomething<K extends Enum>(a: K, b: TypeMap[K]) {
if (isA(a, b)) {
let x: number = b;
}
}
这样做,我们可以让编译器成功缩小B的类型。
您可以在this link处进行检查。