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

如何让LRUCache的泛型V依赖于传入的泛型K?

实现LRUCache键值类型的严格绑定

要让LRUCache的键(K)和值(V)一一对应,比如'AccountAPIOAuthToken'只能对应AccountAPIOAuthToken类型的值,你可以通过以下步骤实现:

1. 定义键值映射类型

首先创建一个类型别名,明确每个键对应的具体值类型,把松散的联合类型转换成强关联的映射关系:

// 定义键与对应值的映射
type CacheTypeMap = {
  'AccountAPIOAuthToken': AccountAPIOAuthToken;
  'EpicOAuthV2Token': EpicOAuthV2Token;
  'RPCAuthAuthPlayerV2': RPCAuthAuthPlayerV2;
};

2. 创建类型安全的LRUCache实例

由于原LRUCache<K, V>的泛型允许键值任意组合,我们需要通过重载方法或类型断言来约束操作时的类型匹配。推荐两种方式:

方式一:重载方法实现类型安全子类

继承原LRUCache类,重载set和get方法,强制键值对应:

class TypedLRUCache extends LRUCache<keyof CacheTypeMap, CacheTypeMap[keyof CacheTypeMap]> {
  // 重载set方法,约束键对应的值类型
  override set<K extends keyof CacheTypeMap>(key: K, value: CacheTypeMap[K]): void {
    super.set(key, value);
  }

  // 重载get方法,返回对应键的具体值类型
  override get<K extends keyof CacheTypeMap>(key: K): CacheTypeMap[K] | undefined {
    return super.get(key) as CacheTypeMap[K];
  }
}

// 创建类型安全的缓存实例
const myCache = new TypedLRUCache(/* 传入LRUCache配置参数 */);

方式二:类型断言扩展现有实例类型

如果不想创建子类,可以通过类型断言给现有实例添加类型约束:

// 定义带类型约束的缓存类型
type TypedLRUCache = LRUCache<keyof CacheTypeMap, CacheTypeMap[keyof CacheTypeMap]> & {
  set<K extends keyof CacheTypeMap>(key: K, value: CacheTypeMap[K]): void;
  get<K extends keyof CacheTypeMap>(key: K): CacheTypeMap[K] | undefined;
};

// 创建实例并断言为类型安全版本
const myCache = new LRUCache(/* 传入配置参数 */) as TypedLRUCache;

使用效果

现在调用myCache.set或myCache.get时,TypeScript会自动校验键值类型:

  • 当传入键'AccountAPIOAuthToken',必须传入AccountAPIOAuthToken类型的值,否则会触发类型错误
  • 调用myCache.get('EpicOAuthV2Token')时,返回值会被推导为EpicOAuthV2Token | undefined,而非所有值的联合类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:19:55