如果obj是类型之一,如何检查属性是否存在

时间:2019-04-11 20:44:52

标签: typescript

比方说,我实现通用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 } } 是唯一选择吗?

2 个答案:

答案 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
    }
}