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

如何从映射类型中推断泛型参数?

从模板字面量映射键中推断泛型参数并关联值类型

我需要用模板字面量类型作为映射类型的键,目标是从update-${SaveKey}格式的键里推断出SaveKey,并把它传入SaveValue<>作为值类型的参数。核心代码的疑问点如下:

type EventsMap = {
  // 如何从`update-${SaveKey}`中推断SaveKey并传入SaveValue<>?
  [K in `update-${SaveKey}`]: (newValue: SaveValue<SaveKey>) => void
}

解决方案

方案1:基于预定义键的键重映射

如果已经明确所有可能的SaveKey类型,可以用TypeScript的映射类型键重映射(as关键字)来实现:

// 预定义所有可能的SaveKey
type SaveKey = 'user' | 'settings' | 'theme';

// 示例SaveValue类型,根据不同SaveKey返回对应类型
type SaveValue<K extends SaveKey> = 
  K extends 'user' ? { name: string } :
  K extends 'settings' ? { darkMode: boolean } :
  { color: string };

// 构造EventsMap:遍历SaveKey生成模板字面量键,同时关联对应值类型
type EventsMap = {
  [K in SaveKey as `update-${K}`]: (newValue: SaveValue<K>) => void
};

这里通过as把每个SaveKey成员转换成update-${K}格式的键,同时直接复用K作为SaveValue的参数,完美实现键和值类型的关联。

方案2:通用的模板字面量推断

如果需要支持任意update-*格式的键,不需要预定义SaveKey,可以用条件类型+infer关键字来动态推断:

// 示例SaveValue类型,这里假设SaveKey是字符串类型
type SaveValue<K extends string> = 
  K extends 'user' ? { name: string } :
  K extends 'settings' ? { darkMode: boolean } :
  { [key: string]: any };

// 通用事件映射类型,自动从键中推断SaveKey
type GenericEventsMap<K extends `update-${string}`> = {
  [Key in K]: Key extends `update-${infer SaveKey}` 
    ? (newValue: SaveValue<SaveKey>) 
    : never
};

// 使用示例
type MyEvents = GenericEventsMap<'update-user' | 'update-settings' | 'update-theme'>;

这个方案会自动从每个符合update-${string}的键里提取出SaveKey部分,再传入SaveValue生成对应的值类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:17