2014-03-26 6 views
8

TypeScript verwendet Kompilierzeit (statisch) duck typing.TypeScript Duck Typing, starke statische Eingabe wünschen

Ich bin ein Fan von primitiven Typen zu erweitern, um inkorrekte Substitution zu verhindern. Zum Beispiel möchte ich einer Kreditkartennummer eine Kreditkartennummer anstelle einer ganzen Zahl geben. Ich habe kürzlich versucht, dies in TypeScript mit einem Paar Schnittstellen zu tun, die String erweitern, und herausgefunden, dass sie sich gegenseitig ersetzen (und diese Zeichenfolge ersetzt beide).

Ich möchte wirklich kompilieren nominal tippen. Irgendwelche Ideen?

+1

Meinst du nominelle Typisierung? Das Type-Script-Typsystem ist statisch, und die Laufzeit-Semantik von JavaScript ist grundsätzlich schwach, was zu einem starken Typ-System führen würde. –

+0

Ja, nominale Typisierung ist der Begriff, den ich brauchte. Bearbeiteter Verweis auf starke Eingabe oben. Vielen Dank! – Eric

+0

mögliches Duplikat von [Gibt es eine Möglichkeit, nominale Typen in TypeScript zu erstellen, die primitive Typen erweitern?] (Http://stackoverflow.com/questions/26810574/is-there-a-way-to-create-nominal-types- In-typscript-that-extend-primitive-types) –

Antwort

3

Ich kam mit einem Weg, um stärker zu tippen. Ich mag es nicht sehr. Man fügt jedem Typ ein spezielles Feld oder eine Methode hinzu, die es mit anderen unvereinbar macht, die als Enten verwechselt werden.

Im Folgenden ist es nicht möglich, einen Papagei durch einen Duck zu ersetzen, da die Duck-Klasse eine zusätzliche Methode besitzt (Parrot schlägt bei der Eingabe fehl). Spatzen und Papageien sind anscheinend bei der Typisierung von Enten ersetzbar, weil es nichts gibt, was ein Papagei tun kann, was ein Spatz nicht kann, und umgekehrt. Natürlich kann eine Ente einen Papagei ersetzen, denn wenn es wie ein Papagei klingt, ist es ein Papagei.

-Test mit www.typescriptlang.org/Playground/:

class Sparrow { 
    sound = "cheep"; 
} 
class Parrot { 
    sound = "squawk"; 
} 
class Duck { 
    sound = "quack"; 
    swim(){ 
     alert("Going for a dip!"); 
    } 
} 
var parrot: Parrot = new Sparrow(); // substitutes 
var sparrow: Sparrow = new Parrot(); // substitutes 
var parrotTwo: Parrot = new Duck(); 
var duck: Duck = new Parrot(); // IDE & compiler error 

alert("Parrot says "+parrot.sound+" and sparrow says "+sparrow.sound+", and 2nd parrot says "+parrotTwo.sound); 
alert("A duck says "+duck.sound); 

Mehr praktisch, ich würde das tun (was in meinem IDE funktioniert, aber nicht auf dem Spielplatz):

interface RawUri extends String { 
    rawUri; 
} 

interface EncodedUri extends String { 
    encodedUri; 
} 

var e: EncodedUri = new RawUri(); // IDE & compiler error 
var r: RawUri = new EncodedUri(); // IDE & compiler error 

widerwärtig, und eine Chance für eine andere Schnittstelle versehentlich den gleichen Feldnamen verwenden. Ich nehme an, man könnte dem Anti-Enten-Mitglied ein zufälliges Element hinzufügen.

Verwandte Themen