You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数组元素作为TypeScript对象的键类型?

解决TypeScript中从数组元素属性生成对象键类型的问题

你当前的写法存在两个核心问题:

  • 普通数组的title会被TypeScript推断为宽泛的string类型,而非具体的字面量('foo'、'bar')
  • titlesType是数组元素的完整类型({title: string; date: string}),不能直接用作对象键的类型

以下是可行的解决方案:

步骤1:让TypeScript保留数组元素的字面量类型

将items用as const断言为只读字面量数组,这样TypeScript会捕获每个title的具体值,而非宽泛的string:

const items = [
    {
        title: 'foo',
        date: '123'
    },
    {
        title: 'bar',
        date: '456'
    }
] as const;

步骤2:提取title的字面量联合类型

通过typeof获取数组类型,再用[number]取数组元素类型,最后提取title属性的类型:

type TitleType = typeof items[number]['title'];
// 此时TitleType的类型是 'foo' | 'bar'

步骤3:定义目标对象类型

用提取出的字面量联合类型作为对象的键类型:

type Fizz = {
    [K in TitleType]: boolean;
};

完整示例

const items = [
    {
        title: 'foo',
        date: '123'
    },
    {
        title: 'bar',
        date: '456'
    }
] as const;

type TitleType = typeof items[number]['title'];
type Fizz = { [K in TitleType]: boolean };

// 符合类型要求的示例
const validFizz: Fizz = {
    foo: true,
    bar: false
};

// 错误示例:缺少键或存在额外键都会触发类型报错
const invalidFizz: Fizz = {
    foo: true
};

补充说明

如果items是运行时从API动态获取的数据,TypeScript在编译期无法知晓具体的title值,这种情况下只能用宽泛的string作为键类型,或者根据API文档手动定义title的字面量联合类型。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:09:57