我正在使用TypeScript 3.2.2,并且我有一个React组件,它接受对象数组。这些对象是通用的,但有一些例外:它们不能嵌套,并且都必须具有相同的形状。例如:
const entries = [
{title: "foo", description: "bar", message: "hello"},
{title: "something", description: "a thing", message: "thing"},
{title: "hello", description: "greeting", message: "greetings!!"}
]
除此之外,我不在乎对象的内容。它们可以具有任意数量的属性,属性可以具有任何名称,其值可以是任何类型。但是,如果某个对象缺少某个条目或有一个多余的条目,或者包含另一个对象,则该组件将损坏。
在TypeScript类型系统中是否有表达这种要求的方法?
答案 0 :(得分:2)
您可以执行以下操作:
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;
}
现在您已将对象表示为接口,可以通过以下两种方法来声明任何值作为此类型的数组:
Array<MyObject>
或
MyObject[]
我更喜欢后者,有些更喜欢前者。这只是一个口味问题,因为它们都表达了这样的想法,即给定值是仅包含指定类型成员的数组。