簡體   English   中英

Typescript 在將數字枚舉映射到字符串枚舉時抱怨

[英]Typescript complains when mapping numeric enum to string enum

我正在嘗試將從 gRPC 原型文件生成的基於數字的枚舉 map 轉換為基於字符串的枚舉,以便在我的 REST API 中使用。

映射有效,但 TS 抱怨,給出此錯誤。

我做錯了什么,如何解決?

types/mapping.ts:5:14 - error TS2739: Type '{ 3: OperationMode.LEARNING; 2: OperationMode.MAINTENANCE; 1: OperationMode.NORMAL; 4: OperationMode.TESTING; 0: undefined; }' is missing the following properties from type '{ 0: OperationMode | undefined; OPERATION_UNSPECIFIED: OperationMode | undefined; OPERATION_NORMAL: OperationMode | undefined; ... 6 more ...; 4: OperationMode | undefined; }': OPERATION_UNSPECIFIED, OPERATION_NORMAL, OPERATION_MAINTENANCE, OPERATION_LEARNING, OPERATION_TESTING

5 export const operationModeG2R: {[key in gRPCOperationMode]: OperationMode|undefined} = {
               ~~~~~~~~~~~~~~~~

@grpc/proto生成的代碼:

export const OperationMode = {
  OPERATION_UNSPECIFIED: 0,
  OPERATION_NORMAL: 1,
  OPERATION_MAINTENANCE: 2,
  OPERATION_LEARNING: 3,
  OPERATION_TESTING: 4,
} as const;

rest-api.ts中定義的代碼

export enum OperationMode {
    NORMAL = 'NORMAL',
    MAINTENANCE = 'MAINTENANCE',
    LEARNING = 'LEARNING',
    TESTING = 'TESTING',
  }
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
}

gRPCOperationMode是一個運行時值,不能在映射類型內部使用,因為映射類型只能與類型一起使用。

您想使用typeof和 map 獲取gRPCOperationMode的類型,而不是使用keyof的鍵。 但是gRPCOperationMode的鍵是字符串類型。 由於要獲取每個鍵值的數字字面量類型,因此需要使用鍵重映射將 map 每個鍵K轉換為其對應的類型gRPCOperationMode[K]

export const operationModeG2R: { 
  [K in keyof typeof gRPCOperationMode as typeof gRPCOperationMode[K]]: 
    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
}

操場

@tobias-s 的回答是我的特定問題的正確答案。

然而,在查看生成的文件后,我可以看到已經有一個簡寫類型OperationMode__Output用於這種情況,我想通過搜索特定的 gRPC 相關問題來分享給任何來到這里的人:

// Original file: proto/autofuel.proto

export const OperationMode = {
  OPERATION_UNSPECIFIED: 0,
  OPERATION_NORMAL: 1,
  OPERATION_MAINTENANCE: 2,
  OPERATION_LEARNING: 3,
  OPERATION_TESTING: 4,
} as const;

export type OperationMode =
  | 'OPERATION_UNSPECIFIED'
  | 0
  | 'OPERATION_NORMAL'
  | 1
  | 'OPERATION_MAINTENANCE'
  | 2
  | 'OPERATION_LEARNING'
  | 3
  | 'OPERATION_TESTING'
  | 4

export type OperationMode__Output = typeof OperationMode[keyof typeof OperationMode]

這意味着我可以這樣做:

import { OperationMode as GRPCOperationMode, OperationMode__Output } from "../proto/generated/companyname/control/OperationMode";
import { OperationMode } from "./rest-api";

export const operationModeG2R: { 
  [K in OperationMode__Output]: 
    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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM