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

如何为TypeScript函数正确类型定义以实现键值对应映射?

实现TypeScript函数输入输出的严格键值映射

当然可以,你需要通过映射类型+泛型让TypeScript识别输入和返回值的精确对应关系,而非使用宽泛的联合类型。以下是两种可行的实现方式:

方式一:基于映射类型手动实现switch

先定义明确的键值映射类型,绑定每个输入与对应输出,再用泛型函数约束输入输出:

// 定义精确的键值映射关系
type KeyValueMap = {
  1: "one";
  2: "two";
  3: "three";
};

// 从映射类型导出键和值的联合类型(可选,用于复用)
type RecordKeys = keyof KeyValueMap;
type RecordValues = KeyValueMap[RecordKeys];

// 泛型函数实现严格对应
function test<K extends RecordKeys>(param: K): KeyValueMap[K] {
  switch (param) {
    case 1:
      return "one" as KeyValueMap[K];
    case 2:
      return "two" as KeyValueMap[K];
    case 3:
      return "three" as KeyValueMap[K];
    default:
      // 穷尽检查,避免新增键值后遗漏case
      throw new Error(`Unexpected parameter: ${param}`);
  }
}

调用时TypeScript会自动推断精确的返回值类型:

  • test(1) 返回值类型为 "one"(而非联合类型)
  • test(2) 返回值类型为 "two"

方式二:基于const断言的映射对象(更简洁)

用const断言创建不可变的映射对象,直接基于对象生成类型,无需手动编写switch:

// 用const断言确保对象的键值都是字面量类型
const keyValueMap = {
  1: "one",
  2: "two",
  3: "three",
} as const;

// 从对象导出映射类型、键类型、值类型
type KeyValueMap = typeof keyValueMap;
type RecordKeys = keyof KeyValueMap;
type RecordValues = KeyValueMap[RecordKeys];

// 泛型函数直接返回对应值,类型自动推断
function test<K extends RecordKeys>(param: K): KeyValueMap[K] {
  return keyValueMap[param];
}

这种写法维护成本更低,后续新增或修改键值对时,仅需修改keyValueMap对象,类型会自动同步,同时TypeScript会自动保证输入输出的严格对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:01:19