2016-11-07 2 views
2

In Typoskript, können wir Stringliteral Typen haben, die uns erlauben, Dinge zu tun wie:einer Zeichentyp wörtlichen Wert Drehen

type HelloString = "Hello"; 

Das bin ich so etwas wie ein String enum definieren lässt, wie folgt:

namespace Literals { 
    export type One = "one"; 
    export type Two = "two"; 
} 

Und dann kann ich eine Vereinigung definieren:

type Literal = Literals.One | Literals.Two; 

gibt es eine Möglichkeit, den einzigartigen Wert vonzu extrahierenals Typ Literals.One?

Der Grund dafür ist, dass, wenn ich eine Funktion wie folgt definieren:

function doSomething(literal : Literal) { 

} 

ich wirklich würde gerne folgendes tun: nicht

doSomething(Literals.One); 

Aber ich kann. Ich habe zu schreiben:

doSomething("one"); 

Antwort

4

Sie können in einem Namespace mit dem gleichen Namen Typen und Werte haben, so können Sie Konstanten für diese Werte definieren:

namespace Literals { 
    export type One = "one"; 
    export type Two = "two"; 
    export const One: One = "one"; 
    export const Two: Two = "two"; 
} 

const s: Literals.One = Literals.One; 
console.log(s); 

Es gibt eine probosal on github for string enums ist, schlagen sie vor, die Aktuelle beste Lösung ist das obige Beispiel.

1

Die Umwandlung eines String-Literaltyps in einen Literalwert ist mit benutzerdefinierten Transformatoren (https://github.com/Microsoft/TypeScript/pull/13940) möglich, die in typescript @ next verfügbar sind.

Bitte schauen Sie in mein NPM-Paket, ts-transformer-enumerate.

Beispiel Nutzung:

// The signature of `enumerate` here is `function enumerate<T extends string>(): { [K in T]: K };` 
import { enumerate } from 'ts-transformer-enumerate'; 

type Colors = 'green' | 'yellow' | 'red'; 
const Colors = enumerate<Colors>(); 

console.log(Colors.green); // 'green' 
console.log(Colors.yellow); // 'yellow' 
console.log(Colors.red); // 'red'