Typescript - 数组的 keyof 值

Pat*_*iak 2 union types dynamic typescript

我有一个清单

export const list = [
  {
    name: 'parentTitle',
  },
  {
    name: 'anotherTitle',
  },
  {
    name: 'whatever',
  },
];
Run Code Online (Sandbox Code Playgroud)

现在我想动态创建一个联合类型,它描述以下内容:

type Title = 'parentTitle' | 'anotherTitle' | 'whatever';
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

我尝试在这里调整这个想法:Keyofnestedchildobjects 但我无法弄清楚

jca*_*alz 7

您的示例中的类型list被编译器推断为,因此当您尝试定义时,Array<{name: string}>编译器已经完全忘记了属性的特定字符串文字类型nameTitle

你必须改变你的分配方式list,至少在某种程度上。最简单的事情(可能满足也可能不满足您的需求)是使用断言const它要求编译器推断可能的最窄类型:

export const list = [
    { name: 'parentTitle', },
    { name: 'anotherTitle', },
    { name: 'whatever', },
] as const;
Run Code Online (Sandbox Code Playgroud)

现在list推断为以下类型:

/* 
const list: readonly [
    { readonly name: "parentTitle";}, 
    { readonly name: "anotherTitle";}, 
    { readonly name: "whatever";}
]
*/
Run Code Online (Sandbox Code Playgroud)

这是一个只读对象的只读元组,具有name特定顺序的特定属性。由此我们可以使用查找类型来定义Title

type Title = typeof list[number]["name"];
// type Title = "parentTitle" | "anotherTitle" | "whatever"
Run Code Online (Sandbox Code Playgroud)

好的,希望有帮助;祝你好运!

Playground 代码链接