Typedef, как C/С++ - программирование
Подтвердить что ты не робот

Typedef, как C/С++

Я использую превосходную библиотеку Basarats Collections, немного обновленную для создания типов 0.9.0, таких как:

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

Теперь я не хочу писать это полностью каждый раз, когда я его использую. Один из подходов, который, похоже, работает:

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 >>;

Кто-нибудь сталкивается с лучшими идеями?

Я также экспериментирую с 'typedeffing' различными сигнатурами функций без больших результатов.

4b9b3361

Ответ 1

В версии 1.4 Typescript поддерживаются псевдонимы типов (источник, см. также этот ответ):

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

Ответ 2

Прежде всего спасибо за добрые слова:).

Ваше решение действительно оптимально.

Длинный ответ Typescript имеет два пространства объявлений. Типы и переменные.

Единственный способ введения элементов в пространство объявления типа - через класс или интерфейс (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; 

То, что вы хотите, может быть выполнено, если язык имеет макросы, но теперь класс + extends - единственный подход.