如何为每个key获取对应专属类型?TypeScript泛型问题
解决方案:让getType参数与对应key类型绑定
原函数的问题在于泛型T1是整个list共享的,导致所有元素的key被推断为联合类型'a'|'b',进而getType的参数也变成该联合类型。要实现每个getType的参数类型与对应元素的key值绑定,需要让每个元素的类型单独推断,而非共享同一泛型。
修改后的函数声明
declare function func<T extends (string | undefined)[]>(service: { list: { [I in keyof T]: { key?: T[I]; getType?: (data: T[I]) => void } }; }): void;
方案说明
- 泛型
T会被推断为list中所有key值组成的元组类型(而非联合类型),比如传入包含'a'和'b'的list时,T会被推断为['a','b']。 - 通过映射类型
{ [I in keyof T]: ... },为list的每个索引I生成对应的元素类型:该元素的key类型为T[I],对应的getType参数类型也严格等于T[I],实现了每个元素的key与getType参数的一一绑定。
调用示例
export const d = func({ list: [ { key: 'a', getType: data => data }, // data类型为'a' { key: 'b', getType: data => data }, // data类型为'b' { getType: data => data }, // data类型为undefined(无key时的情况) ], });
如果不需要支持可选key,可以将泛型约束改为T extends string[],同时把元素类型中的key?:改为key:,进一步收紧类型约束。
内容的提问来源于stack exchange,提问作者user14881171
相关产品推荐
相关产品推荐

