2013-06-18 20 views
16

Ich habe für 0.9.0 Erstellen von Typen wie Basarats ausgezeichnete Collections Bibliothek leicht aktualisiert werden:typedef wie C/C++

Dictionary<ControlEventType, 
    Dictionary<number, (sender: IControl, 
         eventType: ControlEventType, 
         order: ControlEventOrder, 
         data: any) => void >> 

Nun weiß ich nicht haben will, um zu schreiben, das jedes in voller Mal nutze ich es. Einer der Ansätze, die zu funktionieren scheint ist:

export class MapEventType2Handler extends C.Dictionary<ControlEventType, 
               C.Dictionary<number, 
               (sender: IControl, 
               eventType: ControlEventType, 
               order: ControlEventOrder, 
               data: any) => void >> {} 

dann kann ich schreiben:

EH2: MapEventType2Handler = new MapEventType2Handler(); 

statt:

EH: Dictionary<ControlEventType, 
     Dictionary<number, 
     (sender: IControl, 
     eventType: ControlEventType, 
     order: ControlEventOrder, 
     data: any) => void >>; 

Wer über eine bessere Idee kommen?

Ich experimentiere auch mit 'typedeffing' verschiedene Funktionssignaturen ohne große Ergebnisse.

Antwort

2

Zunächst einmal danke für die freundlichen Worte :).

Ihre Lösung ist eigentlich optimal.

Lange Antwort Typoskript hat zwei Deklarationsbereiche. Typen und Variablen

Die einzige Möglichkeit, Elemente in die Typdeklaration Raum einzuführen über eine Klasse oder eine Schnittstelle ist (0.8.x-Modul verwenden, könnte auch eine Art einzuführen. Die von 0.9.x entfernt)

Schnittstelle wird nicht arbeiten, da die Implementierung intakt bleiben soll (und die Schnittstelle unabhängig von der Implementierung ist).

Variablen funktionieren nicht, da sie keinen Namen in den Typdeklarationsbereich eingeben. Sie führen nur einen Namen in den Variablendeklarationsbereich ein.

z.B .:

class Foo {  
} 

// Valid since a class introduces a Type AND and Variable 
var bar = Foo; 

// Invalid since var introduces only a variable so bar cannot be used as a type 
// Error: Could not find symbol. Since compiler searched the type declaration space 
var baz: bar; 

// Valid for obvious reasons 
var x: Foo; 

Was möchten Sie getan werden könnte, wenn die Sprache ein Makros hatte aber jetzt Klasse + erweitert ist der einzige Ansatz.

+0

nicht mehr richtig - es eine Möglichkeit, jetzt ist, so dass diese aktualisiert werden muss. ;) –

20

Ab Version 1.4 unterstützt Typoskript Aliase geben (source siehe auch this answer):

type MapEventType2Handler = Dictionary<ControlEventType, 
    Dictionary<number, 
    (sender: IControl, 
    eventType: ControlEventType, 
    order: ControlEventOrder, 
    data: any) => void >>; 
+0

[Erweiterte Typen - Typ-Aliase] (https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases) in der Dokumentation. – user1338062