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

TypeScript中如何从自定义类型的成员生成对应的元组类型?

要实现这个ToTuple泛型,你可以参考以下方案,该方案依赖TypeScript 4.1+版本提供的有序对象键特性,可以保证生成的元组类型顺序和你定义对象属性的顺序一致:

// 辅助泛型:向元组头部插入元素
type Prepend<T extends any[], U> = [U, ...T];

// 辅助泛型:按定义顺序提取对象的键,组成元组类型
type ObjectKeysTuple<T, Keys extends any[] = []> = 
  { [K in keyof T]: (k: K) => void } extends { [k: keyof T]: (arg: infer Arg) => void }
    ? Arg extends keyof T
      ? Omit<T, Arg> extends never
        ? Prepend<Keys, Arg>
        : ObjectKeysTuple<Omit<T, Arg>, Prepend<Keys, Arg>>
      : never
    : never;

// 最终实现:把键元组映射为对应的值类型元组
type ToTuple<T> = { [K in keyof ObjectKeysTuple<T>]: T[ObjectKeysTuple<T>[K]] };

你可以用你的示例类型测试效果:

type TheType = {
    PK_1: number;
    PK_2: number;
    PK_3: boolean;
    PK_4: string;
}

// 得到的类型为 [number, number, boolean, string],完全符合预期
type TypeTuple = ToTuple<TheType>;

注意事项

  • 仅当你的对象类型没有索引签名、所有键都是字面量类型时,才能保证返回的元组顺序和属性定义顺序完全一致。
  • 如果对象包含索引签名(如{[key: string]: any}),TypeScript无法确定键的固定顺序,返回结果会不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:45:01