如何从指定对象提取属性类型组成元组类型而非联合类型?
TypeScript:从对象提取值的元组类型而非联合类型
我有一个对象:
const o = { fst: 1, snd: true, trd: '', }
想要从中提取出元组类型 type Values = [number, boolean, string],但尝试以下写法后,得到的是联合类型而非预期的元组:
type O = typeof o type Values = O[keyof O] // Values = string | number | boolean
解决方案
问题出在默认情况下,typeof o生成的是无序的接口类型,keyof O返回的是无序的键联合类型,因此取值后只能得到值的联合类型。要获取元组,需要让TypeScript保留对象的键顺序信息,以下是两种可行方法:
方法一:用const断言保留顺序,通过Object.values生成元组
给原对象添加as const断言,让TypeScript将其识别为只读的字面量对象,同时保留键的顺序。之后通过typeof Object.values(o)就能得到对应值的只读元组类型:
const o = { fst: 1, snd: true, trd: '', } as const; // 获取只读字面量元组 type ReadonlyValueTuple = typeof Object.values(o); // ReadonlyValueTuple = readonly [1, true, ""] // 转换成可写元组 type ValueTuple = [...typeof Object.values(o)]; // ValueTuple = [1, true, ""]
如果需要的是基础类型(如number、boolean)而非字面量类型,可以通过类型映射转换:
type BaseValueTuple = { [I in keyof ValueTuple]: ValueTuple[I] extends number ? number : ValueTuple[I] extends boolean ? boolean : ValueTuple[I] extends string ? string : never }; // BaseValueTuple = [number, boolean, string]
方法二:手动定义键顺序元组,映射值类型
如果不想修改原对象,可以先定义包含目标键顺序的元组,再通过映射每个键对应的值类型生成元组:
const o = { fst: 1, snd: true, trd: '', }; // 定义键的顺序元组 type Keys = ['fst', 'snd', 'trd']; // 映射生成值类型元组 type Values = { [I in keyof Keys]: typeof o[Keys[I]] }; // Values = [number, boolean, string]
这种方式可以精准控制元组的顺序和包含的键,灵活性较高。
内容的提问来源于stack exchange,提问作者yangcurve
相关产品推荐
相关产品推荐

