比方说,我实现通用Base的接口A,B,C很少。
if (username === firstname && password !== fakePassword && (givennamerequired == true && givenname === lastname && givenname.length() > 3))
) {
console.log(`Hi ${firstname}`)
}
与if语句一起使用:
interface Base {
x: number;
y: number;
z: number;
}
interface A extends Base {
a: true;
}
interface B extends Base {
b: true;
}
interface C extends Base {
C: true;
}
如何正确检查属性是否存在?我不要使用任何类型。 function foo(arg: A|B|C){
if(arg.a!==undefined){//throws type error
//do stuff for type a
} else if(arg.b !== undefined){//throws type error
//do stuff for type b
} else if(arg.c !== undefined){ //throws type error
//do stuff for type a
}
}
是唯一选择吗?
答案 0 :(得分:4)
Typescript将仅允许访问公共属性。由于您测试的属性并非对工会的所有成员都通用,因此打字稿将不允许您访问它们。
您可以改用in
类型防护来测试属性的存在。
interface Base {
x: number;
y: number;
z: number;
}
interface A extends Base {
a: true;
}
interface B extends Base {
b: true;
}
interface C extends Base {
C: true;
}
function foo(arg: A|B|C){
if('a' in arg){
arg.a
} else if('b' in arg){
arg.b
} else {
arg.C
}
}
答案 1 :(得分:3)
您可以使用type guard:
function isA(arg: A | B | C): arg is A {
return (<A>arg).a !== undefined;
}
function isB(arg: A | B | C): arg is B {
return (<B>arg).b !== undefined;
}
function foo(arg: A | B | C) {
if (isA(arg)) {
// do stuff for type a
} else if (isB(arg)) {
// do stuff for type b
} else {
// do stuff for type c
}
}