首页 > 解决方案 > TypeScript:如何限制第二个参数值(基于第一个)

问题描述

如果有类似的定义

type GroupIds = 'A'|'B'|'C'
type KeysA = 'A01' | 'A02'
type KeysB = 'B03' | 'B04'
type KeysC = 'C99'

我知道它可以写成

function MethodBy( p0:'A', p1:KeysA )
function MethodBy( p0:'B', p1:KeysB )
function MethodBy( p0:'C', p1:KeysC )
function MethodBy( p0, p1 )
{
    //implement
}

但是我想问一下有没有这样的

//maybe define a mapper
type IMapForKeys<T extends GroupIds> =
{
    [ key: 'A' ]: KeysA
    [ key: 'B' ]: KeysB
    [ key: 'C' ]: KeysC
}

//then method can write like...
function MethodBy<T extends GroupIds>( p0:T, p1:IMapForKeys[T] )
{
    //implement
}

或者有什么解决方法,希望得到提示,谢谢:)

标签: typescript

解决方案


一个可能的解决方案是使用有区别的联合。这是一个例子:

type MyTypeA = {
    p0: "A";
    p1: 'A01' | 'A02';
}

type MyTypeB = {
    p0: "B";
    p1: 'B03' | 'B04';
}

type MyTypeC = {
    p0: "C";
    p1: 'C99';
}

function MethodBy(args: MyTypeA | MyTypeB | MyTypeC) {
    //
}

//e.g.
MethodBy({ p0: "B", p1: "B04" });   //OK
MethodBy({ p0: "B", p1: "C99" });   //compile error

推荐阅读