如何将数组元素作为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
相关产品推荐
相关产品推荐

