Typescript,限制第二个参数依赖于第一个参数类型

时间:2018-04-06 09:59:57

标签: typescript

我有2个对象类型:TypeA和TypeB 我想定义一个获取两个参数的函数。 如果第一个参数是TypeA类型,那么第二个参数只能取值'a'或'b' 但如果第一个参数是TypeB类型,那么第二个参数只能取值'c'或'd'

const A:TypeA =...
const B: TypeB =...

myfunct(A,'a') fine
myfunct(B,'c') fine
myfunct(A,'c') not fine

THX

2 个答案:

答案 0 :(得分:1)

这样的事情应该这样做:

interface TypeA { prop1: string }
interface TypeB { prop2: string }
type SmallA = 'a' | 'b';
type SmallB = 'c' | 'd';
interface MixedA {
    prop1: TypeA;
    prop2: SmallA;
}
interface MixedB {
    prop1: TypeB;
    prop2: SmallB;
}

function myFunc(param: MixedA | MixedB) { }

const A: TypeA = { prop1: "w" };
const B: TypeB = { prop2: "w" };

myFunc({ prop1: A, prop2: 'b' })

希望有所帮助。

答案 1 :(得分:0)

使用重载,您可以这样做:

class TypeA { prop1: string };
class TypeB { prop2: string };

type ab = 'a' | 'b';
type cd = 'c' | 'd';

function func(p1: TypeA, p2: ab): void;
function func(p1: TypeB, p2: cd): void;
function func(p1, p2): void {
    console.log(p1, p2);
}

const ta = new TypeA();
const tb = new TypeB();

func(ta, 'a'); // OK
func(ta, 'b'); // OK
func(tb, 'a'); // NO OK
func(tb, 'c'); // OK
func(ta, 'c'); // NO OK