28

我一直在使用 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 >>;

有人遇到更好的想法吗?

我也在尝试“typedefing”各种函数签名,但没有很好的结果。

4

2 回答 2

38

从 1.4 版开始,Typescript 支持类型别名(来源,另请参阅此答案):

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

首先感谢您的客气话:)。

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

长答案 打字稿有两个声明空间。类型和变量。

将项目引入类型声明空间的唯一方法是通过类或接口(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 是唯一的方法。

于 2013-06-18T10:22:20.963 回答