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

如何在ES6 Map中使用泛型实现自定义Properties类的类型约束

实现方案

核心思路

通过TypeScript类型运算合并两个泛型接口,重叠属性优先取TP的类型,再基于合并后的类型约束Map的键值类型和类方法的入参、返回值类型。

完整代码实现

1. 定义合并类型

// 泛型合并规则:T和G存在同名属性时,优先取T中的类型定义
type MergePriority<G, T> = T & Omit<G, keyof T>;

2. 改造Properties类

class Properties<G, T> {
    // 给Map绑定正确的键值类型
    protected _state = new Map<keyof MergePriority<G, T>, MergePriority<G, T>[keyof MergePriority<G, T>]>();

    // 泛型约束state方法,实现输入key自动推断返回值类型
    state<K extends keyof MergePriority<G, T>>(key: K): MergePriority<G, T>[K] | undefined {
        return this._state.get(key) as MergePriority<G, T>[K] | undefined;
    }
}

使用效果测试

// 示例自定义类型
interface ComplexType {
    name: string;
    id: number;
}

interface GP {
    prop1: string;
    prop2: number;
}

interface TP {
    prop2: ComplexType;
}

class A extends Properties<GP, TP> {}

const a = new A();
// 调用时会自动提示合法key:prop1、prop2
const prop1 = a.state('prop1'); // 自动推断类型:string | undefined
const prop2 = a.state('prop2'); // 自动推断类型:ComplexType | undefined

补充说明

如果业务逻辑可以保证Map中一定存在所有合法key的赋值,可以去掉返回值中的undefined类型,也可以通过类构造函数要求传入初始值来规避空值问题。

内容的提问来源于stack exchange,提问作者rkrd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:36:03