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

如何在TypeScript函数参数中强制对象属性间的类型依赖?

基于泛型T实现自动类型推断的方案

可以通过嵌套泛型关联Transformers和Comparers的类型,无需单独定义Transformers对象的类型,仅通过泛型T就能让TypeScript自动完成类型检查。

类型定义与函数实现

先定义关联逻辑的泛型配置类型,再实现接收该配置的函数:

// 关联Transformers和Comparers类型的配置泛型
type Config<T, TTransformers extends Partial<Record<keyof T, (value: unknown) => unknown>> = {}> = {
  transformers?: TTransformers;
  comparers?: {
    [K in keyof T]: K extends keyof TTransformers 
      ? (obj: T, key: K, value: ReturnType<TTransformers[K]>) => boolean 
      : (obj: T, key: K, value: T[K]) => boolean;
  };
};

// 接收配置的函数,仅需指定泛型T
function createProcessor<T>(config: Config<T>) {
  // 此处编写你的函数逻辑
}

验证示例

以User类型为例,测试自动类型推断效果:

interface User {
  name: string;
  age: number;
}

// 合法用法:age的transformer返回string,comparers中age的value自动推断为string
createProcessor<User>({
  transformers: {
    age: (val) => String(val)
  },
  comparers: {
    age: (obj, key, value) => value.length > 2, // value类型为string,符合要求
    name: (obj, key, value) => value.startsWith('A') // value类型为User['name']即string
  }
});

// 非法用法会触发类型报错:transformer返回string,但comparers试图将value当作number使用
createProcessor<User>({
  transformers: {
    age: (val) => String(val)
  },
  comparers: {
    age: (obj, key, value) => value > 18 // TypeScript会报错:value应为string而非number
  }
});

原理说明

  • 给Config类型添加可选的TTransformers泛型参数,默认值为空对象,TypeScript会自动从传入的transformers属性推断其具体类型。
  • 在comparers的类型定义中,通过条件类型判断键是否存在于TTransformers中:存在则使用对应transformer的返回值类型作为value类型,不存在则使用原类型T[K]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:58:20