2017-02-16 4 views
0

Ich versuche derzeit, eine verallgemeinerte Klasse als Alias ​​zu verwenden. Ich benutze das typescript-collections-Paket und möchte etwas umbenennen.Typescript Alias ​​Instanz der verallgemeinerten Klasse

class Bar<T> {} 
class Foo = Bar<X>; 

Wie würde ich die zweite Linie machen?

+1

Was versuchen Sie mit der 2. Zeile zu erreichen? Wie würdest du 'Foo' dann benutzen? –

+0

Ich plane nur zu ersetzen 'Bar ' mit 'Foo' überall, wo ich es sehe. 'Bar ' ist ein sehr langer Name, der aus dem typescript-collections-Paket stammt und 'Foo' ist ein viel aussagekräftigerer Name. – iHowell

+1

können Sie einfach Foo eingeben = Bar ; aber ich bin mir nicht sicher, welchen Zweck das erfüllen würde. Neben einem Typalias an einigen Stellen .. können Sie den Typ nicht verwenden, um beispielsweise neue Objekte zu erstellen, sondern nur als Typalias. – toskv

Antwort

2

Wenn alles, was Sie brauchen, ist alias Bar<X> in Typenannotationen/Hinweise an anderen Stellen (zB function blah(foo: Bar<X>).) Sie die folgende Anweisung verwenden:

type Foo = Bar<X>; 

Beachten Sie, dass Sie noch nicht new Foo() tun können, die type Die Anweisung trägt nur zum Typ "types" von TypeScript bei und nicht zum Teil "values" (wie eine Klasse).

Wenn Sie eine tatsächliche Klasse wollen, eine einfache und effektive Lösung wäre es, die ursprüngliche Bar<X> Klasse wie so zu erweitern:

class Foo extends Bar<X> {} 

ich persönlich nicht besonders mag diese Lösung aber, wie es macht Ihr Code ist weniger klar.

+0

Gibt es eine Möglichkeit, den zweiten Teil zu tun, und nicht nur die Typinformationen? – iHowell

+1

Bearbeitet. Auch diese Lösung gefällt mir nicht besonders. Die OO-Vererbung sollte nicht für Aliasing verwendet werden. –

1

Sie können Foo von Bar<X> erben vordefinierte eine Klasse mit dem X Typ-Parameter zu machen:

class Foo extends Bar<X> {} 
1

Sie können eine Art Alias ​​als @toskv vorgeschlagen:

type Foo = Bar<X>; 

Dann können Sie verwenden es als eine Art:

let foo: Foo = new Bar<X>(); 

Wenn Sie einen Konstruktor haben werden, die eine Instanz von X dann der Compiler den Typ wird folgern erhält:

class Bar<T> { 
    constructor(x: X) { } 
} 

let foo: Foo = new Bar(); 

Wenn Sie eine neue Klasse wollen, die für eine bestimmte generische Einschränkung gebunden ist, dann müssen Sie tun so etwas wie:

class Foo extends Bar<X> { ... } 

let foo = new Foo(); 
1

Wenn alles, was Sie brauchen, ist ein Typ alias ist, dann können Sie Typ verwenden, es auf diese Weise zu erstellen:

type Foo = Bar<X>; 

Damit Sie in der Lage sein wird, Dinge wie:

let x: Foo; 

aber nicht:

let x= new Foo(); 

Eine andere Lösung wäre, nur Bar zu verlängern und eine leere Klasse. Es ist nicht wirklich so, wie Sie die Klassenhierarchien verwenden sollten, aber es tut, was Sie brauchen.

class Foos extends Bar<number> { } 
Verwandte Themen