从 Typescript 对象数组的属性中提取 key/value 对象类型
Extract a key/value object type from the properties of an array of objects in Typescript
我有一个使用相同属性的常量对象数组。像这样:
const allData = [{
name: 'info', content: Info
},{
name: 'other', content: Other
},{
...
}];
现在我想创建一个变量,在其他一些代码之后是 运行,将它们映射到一个对象,其中键是 name 属性 并且值是 content 属性 的实例。鉴于此,我想知道如何在 Typescript 中定义这样一种类型,它基本上会从我的常量中提取这些属性,以便最终变成这样:
Type ContentInstances = {
info: Info,
other: Other
...
}
是否有这种方法可以使用 typeof 和 Typescript 上的其他东西来基于 allData 常量动态实现此目的?
编辑
基本上在后期,我会有这样的东西:
let myVar: ContentInstances;
...
myVar = allData.reduce((obj, value) => {
obj[value.name] = new value.content(customParam);
return obj;
}, {})
您需要先使用 as const
键入您的常量变量,以允许 TypeScript 对文字类型进行智能推断。之后,您可以将其与映射类型组合以创建新类型。
const allData = [{
name: 'info', content: { hey: "you" }
}, {
name: 'other', content: { bro: "chill" }
}] as const;
// the intersection lets us pick out the types in the array that match
// the given `name` property type
type ContentInstances =
{ [K in typeof allData[number]["name"]]: typeof allData[number] & { readonly name: K } }
const foo: ContentInstances["info"] = {
name: "info",
content: {
hey: "you",
// @ts-expect-error this correctly fails
asdf: 2,
}
};
以下应该可以解决问题:
const allData = [
{
name: "info",
content: { hey: "you" },
},
{
name: "other",
content: { bro: "chill" },
},
] as const;
type ContentInstances = {
[K in typeof allData[number]["name"]]: Extract<
typeof allData[number],
{ name: K }
>["content"];
};
declare const foo: ContentInstances;
foo.info.hey;
foo.other.bro;
类型 ContentInstances
遍历包含在 allData
中的对象的所有 "name"
键。它将每个键映射到具有该键的对象的联合,然后使用 "content"
键索引联合。
我有一个使用相同属性的常量对象数组。像这样:
const allData = [{
name: 'info', content: Info
},{
name: 'other', content: Other
},{
...
}];
现在我想创建一个变量,在其他一些代码之后是 运行,将它们映射到一个对象,其中键是 name 属性 并且值是 content 属性 的实例。鉴于此,我想知道如何在 Typescript 中定义这样一种类型,它基本上会从我的常量中提取这些属性,以便最终变成这样:
Type ContentInstances = {
info: Info,
other: Other
...
}
是否有这种方法可以使用 typeof 和 Typescript 上的其他东西来基于 allData 常量动态实现此目的?
编辑 基本上在后期,我会有这样的东西:
let myVar: ContentInstances;
...
myVar = allData.reduce((obj, value) => {
obj[value.name] = new value.content(customParam);
return obj;
}, {})
您需要先使用 as const
键入您的常量变量,以允许 TypeScript 对文字类型进行智能推断。之后,您可以将其与映射类型组合以创建新类型。
const allData = [{
name: 'info', content: { hey: "you" }
}, {
name: 'other', content: { bro: "chill" }
}] as const;
// the intersection lets us pick out the types in the array that match
// the given `name` property type
type ContentInstances =
{ [K in typeof allData[number]["name"]]: typeof allData[number] & { readonly name: K } }
const foo: ContentInstances["info"] = {
name: "info",
content: {
hey: "you",
// @ts-expect-error this correctly fails
asdf: 2,
}
};
以下应该可以解决问题:
const allData = [
{
name: "info",
content: { hey: "you" },
},
{
name: "other",
content: { bro: "chill" },
},
] as const;
type ContentInstances = {
[K in typeof allData[number]["name"]]: Extract<
typeof allData[number],
{ name: K }
>["content"];
};
declare const foo: ContentInstances;
foo.info.hey;
foo.other.bro;
类型 ContentInstances
遍历包含在 allData
中的对象的所有 "name"
键。它将每个键映射到具有该键的对象的联合,然后使用 "content"
键索引联合。