打字稿可以根据关键条件定义接口结构吗?

时间:2018-11-01 16:50:19

标签: typescript

我想这样定义Person类型:

interface Person  {
    gender: 'male'|'female';
    pants?: string;
    skirt?: string;
}

但是,我想更具体一点,无论何时gender=male必须存在pants,或者如果gender=female必须存在skirt,就像这样:

interface Person {                Person {
    gender: 'male';     [OR]          gender: 'female';
    pants: string;                    skirt: string;
}                                  }

两者都是相似的对象,不同之处在于键数很少。可能吗?这是输入对象的好习惯吗?

我希望我可以做类似的事情:

interface Person {
    gender: 'male'|'female'|'elf'|'undead';
    head?: string;
    pants?: string exists if gender='male';
    skirt?: string exists if gender='female';
    leg?: string;
    tail?: string exists if gender='elf'|'undead';
}

哈哈...可能我想太多...

1 个答案:

答案 0 :(得分:1)

尽管使用interface样式方法,您仍可以使用区分的并集。

下面是答案。使用TypeScript 3.1.3测试。

type Person = {
    gender: "male";
    pants: string;
} | {
    gender: "female";
    skirt: string;
};

在这种情况下(如果我没记错的话),gender被称为discriminant,它可以帮助编译器静态分析器确定您要使用的类型。

例如

let x: Person = { 
    gender: "male",
    skirt: "red" // <-- Compile error, because when gender is "male", `skirt` does not exist
    // <-- Another error, property `pants` is missing
}

有关更多信息,请尝试研究discriminated unions in TypeScript