在定义类型时,我们可以使一个属性基于另一个属性吗?
一个例子是:
type Parent = {
children?: Child[];
childrenIdSequence: string[]; // Only make this required when `children` is given
}
答案 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}}。