[英]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.