2016-09-18 3 views
2

Die folgende Typdefinition ist nicht implementierbar, aber der Compiler gibt mir keine Warnungen bei der Definition.Warum kann ich in Typoskript unmögliche Schnitttypen erstellen?

Ein Wert darf keine Zahl und eine Zeichenfolge [] und kein Zeichenfolgenliteral sein.

  1. Warum erlaubt Typoskript die Schaffung unmöglicher Typen?
  2. Gibt es einen echten Anwendungsfall zum Definieren von Typen, die nicht implementiert werden können?

Antwort

3

Anders Hejlsberg provided folgende Gründe:

Es ist möglich, primitive Typen zu schneiden (z string & number), aber es ist nicht möglich, tatsächlich Werte solcher Typen zu erstellen (außer undefined). Da solche Typen aus der Instanziierung von generischen Typen resultieren können (was träge durchgeführt wird), ist es nicht möglich, die Operationen, die die Typen erzeugen, konsistent zu erkennen und Fehler zu finden.

Er sagte auch, in einem Kommentar am 3. Juli 2015:

Ein Schnitttyp konstituierende Typen Typ Parameter sein kann. So können Sie schreiben

declare function combine<T, U>(obj1: T, obj2: U): T & U; 

Das fügt wichtige neue Ausdruckskraft hinzu und erlaubt uns, vorhandene JS Redewendungen besser zu modellieren. Da jedoch Typparameter mit beliebigen Argumenten des Typs instanziiert werden können, können wir nicht vorab überprüfen, ob ein Schnittstellentyp "gültig" ist. Stattdessen müssen wir bereit sein, alle Typen zu schneiden und "Fehler" als Typen auftauchen lassen, für die keine Werte möglich sind (z. B. string & number). Sie könnten argumentieren, dass wir Fehler bei der Instantiierung eines solchen Typs haben sollten, aber die Instanziierung eines Typs in einem System vom Typ polymorph ist stark verzögert (dh es geschieht "just in time"), um eine Typexplosion zu vermeiden, und unsere Fehlerberichte würden praktisch unbestimmt werden Wir sind auf diese Weise gegangen.

Verwandte Themen