我有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
答案 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