typedef就像C / C ++一样

时间:2013-06-18 08:30:15

标签: typescript

我一直在使用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'各种功能签名而没有很好的结果。

2 个答案:

答案 0 :(得分:30)

从版本1.4开始,Typescript支持类型别名(source,另请参阅this answer):

#include <iostream>

struct A
{
   virtual ~A() = 0;
   virtual void foo() = 0;
};

void A::foo(){ }
A::~A(){ std::cout << "~A()" << std::endl; }

struct B : A
{
    ~B(){ std::cout << "~B()" << std::endl; }
     void foo() {}  // Need this to be able to instantiate B.
};

A *a = new B;

int main()
{
    delete a;
}

答案 1 :(得分:3)

首先感谢有用的话:)。

您的解决方案实际上是最佳的。

答案很长 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; 

如果语言有宏,你可以做什么,但现在class + extends是唯一的方法。