Skip to content

Typoskript: String-Literal-Union-Typ aus enum

Lösung:

Siehe TS4.1 ANTWORT:

type WeekdayType = `${Weekday}`;

VOR TS-4.1 ANTWORT:

Dies kann nicht programmgesteuert erfolgen... Sie versuchen, den Typ zu konvertieren Weekday, welches ist Weekday.MONDAY | Weekday.TUESDAY | Weekday.WEDNESDAY, zum Typ WeekdayType welches ist "mon" | "tue" | "wed". Diese Umwandlung ist eine Form von Erweiterung, schon seit Weekday ist ein Untertyp von WeekdayType:

type WeekdayExtendsWeekdayType = 
  Weekday extends WeekdayType ? true : false
// type WeekdayExtendsWeekdayType = true

Leider gibt Ihnen der Compiler kein Handle, um eine "Aufzählung" aus dem Aufzählungstyp zu entfernen und Sie mit einfachen Literaltypen zurückzulassen.


Also, Problemumgehungen? Vielleicht brauchst du gar keinen enum, kann aber mit einem Objekt auskommen, dessen Eigenschaftswerte String-Literale sind:

const lit = <V extends keyof any>(v: V) => v;
const Weekday = {
  MONDAY: lit("mon"),
  TUESDAY: lit("tue"),
  WEDNESDAY: lit("wed")
}
type Weekday = (typeof Weekday)[keyof typeof Weekday],

Wenn Sie es inspizieren, Wert genannt Weekday verhält sich wie ein Enum-Objekt:

console.log(Weekday.TUESDAY); // tue

während Typ genannt Weekday verhält sich wie die Vereinigung von Stringwerten "mon" | "tue" | "wed" dass du anrufst WeekdayType:

const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error

Bei dieser Problemumgehung gibt es also keine "Aufzählung" und daher keine Notwendigkeit, den Typ zu unterscheiden Weekday vom Typ WeekdayType. Es ist ein bisschen anders als ein echter enum (welches beinhaltet Typen mögen Weekday.MONDAY, die man als umständlich darstellen müsste typeof Weekday.MONDAY oder erstellen Sie einen anderen Typalias dafür), aber es könnte sich ähnlich verhalten, um nützlich zu sein. Funktioniert das für dich?

Ich hoffe, das hilft. Viel Glück!

TypeScript 4.1+:

Wie bereits erwähnt, kann dies durch die Verwendung von Vorlagenliteraltypen wie folgt erreicht werden:

type WeekdayType = `${Weekday}`;

TypeScript 3.4+:

Im Anschluss an die Antwort von @jcalz und den Kommentar von @just-boris ist hier ein Beispiel mit const-Behauptungen:

const Weekday = {
  MONDAY: "mon",
  TUESDAY: "tue",
  WEDNESDAY: "wed",
} as const;

type Weekday = (typeof Weekday)[keyof typeof Weekday];

Bearbeiten:

Habe einen Blogbeitrag für diejenigen geschrieben, die tiefer graben möchten.

Mit Typescript 4.1 ist es möglich!

enum Weekday {
  MONDAY = 'mon',
  TUESDAY = 'tue',
  WEDNESDAY = 'wed'
}

type WeekdayType = `${Weekday}`;

Achtung: Dies funktioniert nur mit String-Enum-Werten, nicht mit Number-Enum-Werten.

Click to rate this post!
[Total: 0 Average: 0]



Anderer Beitrag

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.