我想这样定义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';
}
哈哈...可能我想太多...
答案 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。