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

如何从指定对象提取属性类型组成元组类型而非联合类型?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:40:00