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

如何优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:35:24