将gRPC生成的数值枚举映射为字符串枚举时TypeScript报错
解决gRPC数值枚举映射REST字符串枚举的TypeScript类型错误
问题根源
你导入的gRPCOperationMode是gRPC生成的const对象(而非TypeScript枚举类型),其类型包含两部分:
- 对象的字符串键:
"OPERATION_UNSPECIFIED"、"OPERATION_NORMAL"等 - 对象的数值值:
0、1、2等
你定义的映射类型{[key in gRPCOperationMode]: OperationMode|undefined}要求对象必须包含上述所有字符串键和数值键,但你的映射对象只提供了数值键的对应关系,因此TypeScript报错提示缺少字符串键的属性。
修复方案
方案1:仅针对数值值构建映射类型(推荐)
我们只需要用gRPC对象的数值值作为映射的key,而非包含字符串键的联合类型。修改映射类型的定义,提取gRPC对象的数值值类型:
import { OperationMode as gRPCOperationModeObj } from "../proto/generated/companyname/control/OperationMode"; import { OperationMode } from "./rest-api"; // 提取gRPC枚举的数值值类型 type gRPCOperationMode = typeof gRPCOperationModeObj[keyof typeof gRPCOperationModeObj]; // 映射类型仅包含数值键 export const operationModeG2R: {[key in gRPCOperationMode]: OperationMode|undefined} = { [gRPCOperationModeObj.OPERATION_LEARNING]: OperationMode.LEARNING, [gRPCOperationModeObj.OPERATION_MAINTENANCE]: OperationMode.MAINTENANCE, [gRPCOperationModeObj.OPERATION_NORMAL]: OperationMode.NORMAL, [gRPCOperationModeObj.OPERATION_TESTING]: OperationMode.TESTING, [gRPCOperationModeObj.OPERATION_UNSPECIFIED]: undefined };
方案2:补充字符串键的映射(不推荐,冗余)
如果必须保留原映射类型,需要补充字符串键的对应关系,但会产生冗余代码:
import { OperationMode as gRPCOperationMode } from "../proto/generated/companyname/control/OperationMode"; import { OperationMode } from "./rest-api"; export const operationModeG2R: {[key in gRPCOperationMode]: OperationMode|undefined} = { // 数值键映射 [gRPCOperationMode.OPERATION_LEARNING]: OperationMode.LEARNING, [gRPCOperationMode.OPERATION_MAINTENANCE]: OperationMode.MAINTENANCE, [gRPCOperationMode.OPERATION_NORMAL]: OperationMode.NORMAL, [gRPCOperationMode.OPERATION_TESTING]: OperationMode.TESTING, [gRPCOperationMode.OPERATION_UNSPECIFIED]: undefined, // 字符串键映射 OPERATION_LEARNING: OperationMode.LEARNING, OPERATION_MAINTENANCE: OperationMode.MAINTENANCE, OPERATION_NORMAL: OperationMode.NORMAL, OPERATION_TESTING: OperationMode.TESTING, OPERATION_UNSPECIFIED: undefined };
方案3:使用类型断言(快速但不安全)
如果你确认实际使用中不会用到字符串键,可以用类型断言跳过TS检查,但这会失去类型安全性:
import { OperationMode as gRPCOperationMode } from "../proto/generated/companyname/control/OperationMode"; import { OperationMode } from "./rest-api"; export const operationModeG2R = { [gRPCOperationMode.OPERATION_LEARNING]: OperationMode.LEARNING, [gRPCOperationMode.OPERATION_MAINTENANCE]: OperationMode.MAINTENANCE, [gRPCOperationMode.OPERATION_NORMAL]: OperationMode.NORMAL, [gRPCOperationMode.OPERATION_TESTING]: OperationMode.TESTING, [gRPCOperationMode.OPERATION_UNSPECIFIED]: undefined } as {[key in gRPCOperationMode]: OperationMode|undefined};
内容的提问来源于stack exchange,提问作者Esben von Buchwald
相关产品推荐
相关产品推荐

