2017-06-20 2 views
0

Ich habe Probleme mit dem Verständnis der Art und Weise, wie Werte von enums-Membern zum Definieren von Typen in Typescript verwendet werden können.Unerwartetes Verhalten mit Enum-Werten als Typen (in Typescript)

Ich verstehe in Typescript können Sie unäre Typen definieren, indem Sie ein primitives Objekt als Typ Wert angeben. Und Enum-Mitglieder haben einen numerischen Wert, der ihnen zugeordnet ist.

Im folgenden Beispiel bin ich Aliasing den Wert eines Enum-Mitglieder als Typ newType. Alles macht Sinn, außer was in der letzten Zeile mit der Variablen d passiert.

const enum blah { 
    test = 1, 
}; 

type newType = blah.test; 

var a: newType = 'a'; // ERROR (Type '"a"' is not assignable to type 'blah'.) 
var b: newType = blah.foo; // ERROR (Property 'foo' does not exist on type 'typeof blah'.) 
var c: newType = blah.test; // WORKS 
var d: newType = 123; // WORKS...??? 

Die letzte Zuweisung funktioniert ohne Fehler. Was ist eine Erklärung dafür?

(Das ursprüngliche Beispiel kam von meinem Kollegen @michaelkyriacou während einer Diskussion über einstellige Typen in Maschinenschrift.)

+0

Ist das nicht 'newType' in Ihrem Beispiel nur ein' number' so Ihr Beispiel würde Sinn machen? – Raven

+0

@Raven was ich erwarte ist, dass der Typ ist der Wert '1', nicht eine' Nummer'. Das passiert, wenn Sie 'newType = 1' eingeben. –

Antwort

1

Alle Zahlen können zu einem Enum-Mitglied zugeordnet werden. Genauso wie alle Zahlen einer Aufzählung zugeordnet werden können. z.B.

const enum blah { 
    test = 1, 
    foo = 2 
}; 

const x: blah = 567; // allowed 
+0

Der Typ der Variablen in meinem Beispiel ist nicht die Enumeration, sondern das Enum-Member. Außerdem erwarte ich, dass dies ein fester Wert und keine Typnummer ist. –

+0

Siehe auch meinen Kommentar unter @ionals Antwort –

0

Der Grund ist, dass Sie sich auf einen Wert aus einer Variablen beziehen.

Was Sie tun, ist im Wesentlichen:

let x = 1 // type of x is number, not 1 
type z = typeof x // the z is of type number. 
+0

Ich sehe nicht, warum das passieren sollte, ich würde erwarten, dass type newType = blah.test äquivalent zu type newType = 1 ist und nicht type newType = typeof 1 '. –