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