如何让对象中某属性的类型依赖于同对象另一属性的类型?
解决方案
问题出在你定义的TConfig里,func和param的类型被固定为TParam(any),导致每个配置项的这两个字段类型无法关联。要让param获得对应func参数的类型提示,需要用泛型让每个配置项的func和param绑定同一类型:
修改后的代码
// 定义泛型类型,让每个配置项的func和param共享同一类型P type TConfigItem<P> = { func: (param: P) => P; param: P; }; // 让handleConfig接受泛型参数,约束输入为键值对,每个值都是TConfigItem<P> function handleConfig<T extends Record<string, TConfigItem<any>>>(config: T) {} type TMyParam1 = { prop1: string; prop2: number; }; type TMyParam2 = { prop3: boolean; prop4: string; }; handleConfig({ '1': { func: (param: TMyParam1) => param, param: { // 现在会自动提示prop1、prop2字段 prop1: "test", prop2: 123 } }, '2': { func: (param: TMyParam2) => param, param: { // 现在会自动提示prop3、prop4字段 prop3: true, prop4: "hello" } } });
原理说明
TConfigItem<P>泛型类型强制每个配置项的func参数类型和param类型必须一致,避免类型脱节。handleConfig使用泛型T约束输入结构,TypeScript会自动推导每个配置项中P的具体类型,从而给param提供准确的字段补全提示。
另一种等价写法:
type TConfig<T extends Record<string, any>> = { [K in keyof T]: { func: (param: T[K]) => T[K]; param: T[K]; }; }; function handleConfig<T extends Record<string, any>>(config: TConfig<T>) {}
通过索引签名结合泛型,同样能让TypeScript自动推导每个键对应的参数类型,实现代码提示效果。
内容的提问来源于stack exchange,提问作者Кирилл Панихин
相关产品推荐
相关产品推荐

