在这种情况下,如何使TypeScript查找类型起作用?

问题描述 投票:0回答:1

对不起的标题,对不起,但我真的不知道该怎么称呼。

我有一个枚举,我想将每个枚举项匹配到一个类型。我这样做是为了使函数的参数可以根据第一个参数动态更改。一个例子:

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时出错,但显然,它应该可以工作。如果aEnum.A,那么b必须按定义为number,对吗?我究竟做错了什么?我如何使它工作?

typescript generics lookup mapped-types
1个回答
0
投票
是)。像这样:

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处进行检查。
© www.soinside.com 2019 - 2024. All rights reserved.