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

TypeScript中如何简洁声明固定键配置映射并保留字面量键类型

TypeScript映射结构的类型约束与字面量键保留优化方案

问题背景

我们需要定义一个存储配置的映射结构,要求:

  • 每个配置值必须符合TabConfig接口规范
  • 键的类型保留字面量联合类型(如'home' | 'about' | 'contact'),而非宽泛的string,方便后续类型校验
  • 避免重复编写satisfies TabConfig,也不用手动维护键的类型定义

最优解决方案:泛型辅助函数

通过一个泛型辅助函数,可以同时满足类型约束和字面量键保留的需求,且写法简洁:

interface TabConfig {
  label: string;
  slug: string;
  color: string;
}

// 泛型辅助函数:约束对象值类型为TabConfig,同时保留原始键的字面量类型
const createConfigMap = <T extends Record<string, TabConfig>>(obj: T) => obj;

// 创建配置映射,无需每个条目添加satisfies
const tabs = createConfigMap({
  home: {
    label: 'Home',
    slug: 'site-home',
    color: 'blue'
  },
  about: {
    label: 'About',
    slug: 'about-us',
    color: 'blue'
  },
  contact: {
    label: 'Contact Us',
    slug: 'contact',
    color: 'green'
  }
});

// 自动推导为字面量联合类型:'home' | 'about' | 'contact'
type TabName = keyof typeof tabs;

方案原理

  • 泛型参数T被约束为Record<string, TabConfig>,确保传入的每个配置值都严格符合TabConfig的结构,编译时会自动校验不符合的情况。
  • 函数直接返回传入的对象,TypeScript会自动推导T为包含原始字面量键的具体类型,而非宽泛的Record<string, TabConfig>,因此keyof typeof tabs能得到精确的字面量联合类型。
  • 新增配置条目时,只需在对象中添加新键值对,无需修改其他地方,类型会自动更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:07:18