צור טיפוס מערכי המספרים של enum ב-Typescript


האם אפשר להמיר enum שמראה לדוגמה:

enum StatusCodeEnum {
  OK = 200,
  BAD_REQUEST = 400,
  UNAUTHORIZED = 401,
  FORBIDDEN = 403,
  NOT_FOUND = 404,
  INTERNAL_SERVER_ERROR = 500,
  SERVICE_UNAVAILABLE = 503,
}

אל סוג התבנית שיהיה בו רק מספרים כמו

TypeFromEnum = 200 | 400 | 500 | ...  ---> numbers

אני מעוניין אך ורק בהמרת enum בלי לעבור לאובייקט רגיל עם "as const"

תשובה #1

זה יהיה אפשרי ב-TypeScript 4.8, עם הסקה יותר ספציפית מסוגי מחרוזות תבנית.

הגישה נראית כך:

type TypeFromEnum = `${Extract<StatusCodeEnum, number>}` extends 
  `${infer N extends number}` ? N : never;
// type TypeFromEnum = 200 | 400 | 401 | 403 | 404 | 500 | 503

אי אפשר לחזור בקלות על ערכים של enum שמכיל רק מספרים כי הוא לא מיוצג פנימית כסוג איחוד, לכן השיטה לעיל קודם לוודא שהיא לוקחת רק חברי enum מספריים (למקרה שמדובר ב-enum מעורב של מחרוזות/מספרים), ממירה אותם לאיחוד של סוגי מחרוזות מילוליות, ואז מחזירה אותם חזרה לסוגי מספרים מילוליים באמצעות טכניקת infer N extends number.

קישור למזחוב קוד

תשובה #2

נסה את זה:

type StatusCodeType = `${StatusCodeEnum}`

// return -> `200 | 400 | 401 | ... `