如何基于只读泛型对象生成精确匹配的TypeScript函数签名?
在TypeScript中能否基于只读对象类型生成指定格式的函数签名?
可以实现,并且能严格保证生成的函数签名参数名称、类型和顺序与原只读对象完全一致。以下是具体的实现方案:
核心类型工具
// 将只读对象转换为包含参数名与类型的有序元组 type ReadonlyObjectToParamTuple<T extends Readonly<Record<string, any>>> = T extends Readonly<infer U> ? { [K in keyof U]: [K, U[K]] }[keyof U] extends infer Tuple ? Tuple extends [string, any] ? [...Tuple[]] extends infer OrderedTuple ? { [I in keyof OrderedTuple]: OrderedTuple[I] extends [infer Name extends string, infer Type] ? [Name, Type] : never } : never : never : never : never; // 将带参数名的元组转换为目标函数签名 type TupleToFunction<T extends [string, any][]> = T extends [infer Name extends string, infer Type][] ? (...args: { [P in Name]: Type } extends Record<string, infer V> ? [P in Name]: V : never) => void : never; // 组合工具:从只读对象直接生成函数签名 type ReadonlyObjectToFunction<T extends Readonly<Record<string, any>>> = TupleToFunction<ReadonlyObjectToParamTuple<T>>;
示例验证
// 示例1 type input0 = Readonly<{x: number, y: number, z: number}>; type input0signature = ReadonlyObjectToFunction<input0>; // 生成的类型:(x: number, y: number, z: number) => void // 示例2 type input1 = Readonly<{id: number, age: number}>; type input1signature = ReadonlyObjectToFunction<input1>; // 生成的类型:(id: number, age: number) => void
原理说明
- 保留键顺序:TypeScript 2.9及以上版本会保留对象字面量的属性声明顺序,因此
keyof U会按原对象属性顺序返回键名。 - 元组带标签:将对象的每个属性转换为
[参数名, 参数类型]的元组,再组合成有序元组,确保参数名和顺序不丢失。 - 元组转函数参数:通过剩余参数语法将带标签的元组转换为函数签名,IDE会自动将其解析为显式的命名参数列表,完全符合需求。
内容的提问来源于stack exchange,提问作者moomoolive
相关产品推荐
相关产品推荐

