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

