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

