28

Basarats の優れたCollectionsライブラリを使用して、0.9.0 用にわずかに更新して、次のような型を作成しています。

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

今では、これを使用するたびにこれを完全に記述する必要はありません。うまくいくと思われるアプローチの1つは次のとおりです。

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

次に、次のように記述できます。

EH2: MapEventType2Handler = new MapEventType2Handler();

それ以外の:

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

誰もがより良いアイデアに出くわしますか?

また、さまざまな関数シグネチャの「型定義」を試していますが、大きな結果は得られません。

4

2 に答える 2

38

バージョン 1.4 から、Typescript は型エイリアスをサポートします ( source 、この回答も参照してください)。

type MapEventType2Handler = Dictionary<ControlEventType, 
    Dictionary<number, 
    (sender: IControl, 
     eventType: ControlEventType, 
     order: ControlEventOrder, 
     data: any) => void >>;
于 2015-06-10T04:39:47.143 に答える
3

まず、親切な言葉をありがとう:)。

あなたのソリューションは実際には最適です。

長い回答 Typescript には宣言スペースが 2 つあります。タイプと変数。

型宣言空間に項目を導入する唯一の方法は、クラスまたはインターフェースを介することです (0.8.x ではモジュールを使用して型を導入することもできます。0.9.x から削除されました)。

実装をそのままにしておく必要があるため、インターフェイスは機能しません(インターフェイスは実装に依存しません)。

型宣言スペースに名前を導入しないため、変数は機能しません。それらは、変数宣言スペースに名前を導入するだけです。

例えば:

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; 

言語にマクロがある場合は、必要なことを実行できますが、今のところ、クラス + 拡張が唯一のアプローチです。

于 2013-06-18T10:22:20.963 に答える