如何优化TypeScript函数,使value参数类型匹配对应对象键类型?
TypeScript 实现键与值的精准类型绑定
问题场景
我定义了如下类型:
export type Signals = { activity: boolean; quest: string; creator: number; }
基于该类型实现了initStation函数,但signal方法的value参数始终是联合类型,无法根据指定的id自动匹配对应类型:
export function initStation<T>(){ return { signal: (id: keyof T, value: T[keyof T]){ // code } } }
需要实现精准的类型约束:当id为activity时value只能是boolean;id为quest时value只能是string;id为creator时value只能是number,同时在传入错误类型时触发TypeScript报错。
期望的安全调用示例:
const station = initStation<Signals>() station.signal('activity', true); // 正常 station.signal('quest', 'any quest'); // 正常 station.signal('creator', 1234); // 正常
错误调用需触发报错:
station.signal('activity', 'abc'); // 报错 station.signal('quest', 123); // 报错 station.signal('creator', true); // 报错
解决方案
给signal方法添加泛型参数K,让其绑定到具体的键名,从而实现id与value的类型强关联。修改后的代码如下:
export function initStation<T>(){ return { signal: <K extends keyof T>(id: K, value: T[K]) => { // 业务逻辑代码 } } }
实现原理
- 泛型参数
K extends keyof T限定了K只能是T的键名之一; - 调用
signal时,TypeScript会根据传入的id自动推断K的具体值,进而约束value必须为T[K]对应的类型; - 这样就彻底解决了原实现中
value为联合类型的问题,实现了精准的类型校验。
内容的提问来源于stack exchange,提问作者Marcel Armada-Castellon
相关产品推荐
相关产品推荐

