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
相关产品推荐
相关产品推荐

