【发布时间】:2022-04-19 03:24:07
【问题描述】:
基本问题和背景
我正在尝试键入一个对象数组,其中每个对象都具有一组中的一个键。例如:
const foo = [
{ a: 'foo' },
{ b: 'bar' },
{ c: 'baz' },
]
我的第一次尝试是key in 一个联合:
type Foo = { [key in 'a' | 'b' | 'c']: string }[]
const foo: Foo = [
{ a: 'foo' },
{ b: 'bar' },
{ c: 'baz' },
]
这不起作用,因为 Typescript 希望 每个 对象在联合中拥有 所有 键:
type Foo = { [key in 'a' | 'b' | 'c']: string }[]
const foo: Foo = [
{ a: 'foo', b: 'bar', c: 'baz' },
{ a: 'foo', b: 'bar', c: 'baz' },
{ a: 'foo', b: 'bar', c: 'baz' },
]
我的第二次尝试是:
type A = { a: string }
type B = { b: string }
type C = { c: string }
type Foo = (A | B | C)[]
const foo: Foo = [
{ a: 'foo' },
{ b: 'bar' },
{ c: 'baz' },
]
但是,作为jcalz points out,仍然允许:
const foo: Foo = [{ a: 'foo', b: 'bar' }]
有没有办法强制每个对象只有一个键并且该键是a 或 b 或 c?
更多上下文
我们的项目正在尝试读取this JSON 来处理 React 中不同国家的地址字段的动态表单。当 Typescript 读取 JSON blob 时,大多数事情都会出错。最重要的是,它认为 fields 键并不总是一个数组,因此不会让我 .map 超过它。所以我决定将 JSON blob 复制到我们的项目中并手动输入。我试图捕捉fields 数组是thoroughfare、premise 或locality 的对象数组,而locality 是localityname 的对象数组等。
【问题讨论】:
-
您的解决方案也允许
const foo: Foo = [{a: "foo", b: "bar"}]。当您说“确切地”一个键时,您的意思是“至少”吗?也就是说,您的解决方案等同于this,这可能是也可能不是您的问题的答案,具体取决于您的要求。 -
伟大的收获和伟大的问题!我的数据来自一个静态 JSON 文件,其中没有
{ a: '', b: '' }项。话虽如此,我不确定我的打字是否需要排除这种情况。基本上我使用的是if ('a' in obj) { ... },所以在{ a: '', b: '' }的情况下,我的解决方案取决于顺序但不会中断,因为源数据没有这种情况。话虽如此,让我们假设我不想允许{ a: '', b: '' }。我会更新问题:-)
标签: typescript