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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:10:29