reactjs - 强制对象数组中的每个对象都具有相同的形状

标签 reactjs typescript

我使用的是 TypeScript 3.2.2,我有一个接受对象数组的 React 组件。这些对象是通用的,但有一些异常(exception):它们不能嵌套,并且必须都是相同的形状。例如:

const entries = [
    {title: "foo", description: "bar", message: "hello"},
    {title: "something", description: "a thing", message: "thing"},
    {title: "hello", description: "greeting", message: "greetings!!"}
]

除此之外,我不关心对象的内容。他们可以拥有任意数量的属性,属性可以有任何名称,它们的值可以是任何类型。但是,如果其中一个对象缺少一个条目或有一个额外的条目,或者它包含另一个对象,组件就会中断。

有没有办法在 TypeScript 类型系统中表达这种需求?

最佳答案

你可以这样做:

interface MyObject {
  [key: string]: string | number | boolean | undefined | null
}

基本上允许任何键的原始值,只要该键是字符串类型。这确保没有嵌套对象或数组(尽管您可以将 Array 作为类型包含在内)

您还可以显式定义您可能期望的属性,以便从智能感知中获益并获得一些额外的类型安全性:

interface MyObject {
  [key: string]: string | number | boolean | undefined | null;
  title?: string;
  description?: string;
  message?: string;
}

既然您已经将对象表示为接口(interface),那么可以通过两种方式将任何值声明为这种类型的数组:

Array<MyObject>

MyObject[]

我更喜欢后者,有些人更喜欢前者。这只是一个品味问题,因为它们都表达了给定值是仅包含指定类型成员的数组的想法。

关于reactjs - 强制对象数组中的每个对象都具有相同的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54482529/

相关文章:

typescript - 导入 FastClick

javascript - 在 Angular 中导入和使用外部 JS 库

javascript - 在 ReactJS 中映射对象数组的问题

reactjs - 如何在 URL axios post 方法中使用 id 使用react?

javascript - 如何更新这个 Reactjs 选择

javascript - 在文本输入控件中,如何用退格键替换删除,反之亦然?

javascript - 运行 npm start 命令后应用程序崩溃

javascript - 尝试构建一个基本的 React-Redux 点击切换器,但没有显示任何内容

angular - 如何延迟 Angular 6/Typescript 中的可观察对象

angular - Angular 6 项目中 2 tslint.json 文件的使用