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

如何基于只读泛型对象生成精确匹配的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

原理说明

  1. 保留键顺序:TypeScript 2.9及以上版本会保留对象字面量的属性声明顺序,因此keyof U会按原对象属性顺序返回键名。
  2. 元组带标签:将对象的每个属性转换为[参数名, 参数类型]的元组,再组合成有序元组,确保参数名和顺序不丢失。
  3. 元组转函数参数:通过剩余参数语法将带标签的元组转换为函数签名,IDE会自动将其解析为显式的命名参数列表,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:36:13