Mehrere Typensignaturen für Mitglieder, Union Types in TypeScript

70

Wenn ich eine Eigenschaft habe, die eine Zeichenfolge oder ein Boolescher Wert sein kann, wie definiere ich sie:

interface Foo{
    bar:string;
    bar:boolean;
}

Ich möchte nicht auf Folgendes zurückgreifen:

interface Foo{
    bar:any;
}

Ich denke nicht, dass es ohne möglich ist any. Sie können eine der folgenden Fragen beantworten:

Habe ich eine Spezifikation übersehen und sie ist jetzt möglich? Ist so etwas geplant? Wurde eine Funktionsanforderung protokolliert?

Ich würde mir so etwas vorstellen:

interface Foo{
    bar:string;
    bar:boolean;
    bar:any; 
}

var x:Foo = <any>{};
x.bar="asdf";
x.bar.toUpperCase(); // intellisence only for string 
Basarat
quelle
Sie sind sich Ihres Nutzungsszenarios nicht sicher, aber würden Ihnen Generika hier helfen?
Damian

Antworten:

55

Dies wird üblicherweise als "Vereinigungstypen" bezeichnet. Das TypeScript-Typsystem ab 1.4 ermöglicht dies.

Siehe: Erweiterte Typen

Ryan Cavanaugh
quelle
3
Es ist in Funktionen erlaubt, versuche es. Ich denke immer noch (naiv), dass es in Eigenschaften erlaubt sein kann. Aber du hast meine Frage beantwortet. Übrigens. Es ist großartig, ein ts-Teammitglied im Stackoverflow zu haben, danke dafür. PS: Meine größte Sorge ist das langsame Kompilieren. Ich sterbe jedes Mal langsam, wenn es 5 Sekunden dauert, bis ich meinen Code in Aktion
sehe
163

Ab 2015 arbeiten Gewerkschaftstypen:

interface Foo {
    bar:string|boolean;
}
MarcG
quelle
9

Wenn Sie dies nicht sagen, wird Ihre Frage beantwortet, aber könnten Sie auf so etwas zurückgreifen?

interface Foo<T>{
    bar:T;
}

function createFoo<T>(bar:T) : Foo<T>{
    return {bar:bar};
}

var sFoo = createFoo("s");
var len = sFoo.bar.length;

var bFoo = createFoo(true);
var result = bFoo.bar === true;
Damian
quelle
+1 für eine nützliche Antwort. Mein Verwendungsszenario definiert jedoch Typoskript-Schnittstellen für Dinge wie: github.com/gruntjs/grunt-contrib-watch#optionsevent Derzeit any
greife