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

标签 typescript

定义类型时,我们可以根据另一个属性来创建一个属性吗?

一个例子是:

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

最佳答案

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

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

这意味着 Parent 要么有一个 children 数组和一个 childrenIdSequence 数组,要么它的 children 属性是未定义,并且不保证具有 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 类型。

如果您尝试使用 children?: undefined 声明类型作为可选属性,则联合将不起作用,因为一个分支是另一个分支的结构子类型,并且函数中的类型将无用地缩小为 p: never

关于Typescript - 基于另一个属性的条件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59350724/

相关文章:

typescript - angular2 所见即所得的 tinymce 实现和 2 向绑定(bind)

typescript - 为什么 T[string] 不是 TypeScript 中的有效对象查找类型?

javascript - 如何使用类验证器验证多种类型的嵌套数组?

arrays - 使用无效数据调用函数FieldValue.arrayUnion()。 FieldValue.serverTimestamp()只能与update()和set()一起使用

typescript - 使用 typescript 将接口(interface)与 angular 2 中的 html 绑定(bind)

node.js - 如何在 NodeJS Express 中将下载的文件发送到客户端?

typescript - typedef 就像 C/C++

javascript - TypeORM 和 Node JS 中的连接表

javascript - 如何手动触发 Angular 2 输入验证?

angular - 尝试设置路径时无法读取未定义的属性 'loadChildren' 中的错误