如何让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
相关产品推荐
相关产品推荐

