Typescript-基于另一个属性的条件属性

时间:2019-12-16 04:53:00

标签: typescript

在定义类型时,我们可以使一个属性基于另一个属性吗?

一个例子是:

type Parent = {
  children?: Child[];
  childrenIdSequence: string[]; // Only make this required when `children` is given
}

1 个答案:

答案 0 :(得分:1)

您可以使用联合类型实现您想要的:

type Parent = {
  children: Child[],
  childrenIdSequence: string[]
} | {
  children: undefined
}

这意味着Parent要么具有children数组和childrenIdSequence数组,要么其children属性未定义并且不能保证具有{{1 }}数组。可以通过测试childrenIdSequence属性来缩小控制流的类型:

children

但是,有一个缺点:function test(p: Parent): void { if(p.children) { // p: { children: Child[], childrenIdSequence: string[] }, so OK console.log(p.childrenIdSequence); } else { // p: { children: undefined }, so type error console.log(p.childrenIdSequence); } } 属性是必需的,即使您希望未定义它也是如此。您必须显式地编写一个像children这样的文字,而不仅仅是{ children: undefined },否则它将不是{}类型的文字。

如果您尝试使用Parent作为可选属性来声明类型,则联合将不起作用,因为一个分支是另一分支的结构子类型,并且该函数中的类型将无用地缩小为{ {1}}。