2017-02-16 132 views
0

我目前正在尝试别名泛化类。我正在使用typescript-collections软件包并希望进行一些重命名。类型化别名泛化类的实例

class Bar<T> {} 
class Foo = Bar<X>; 

我该如何去做第二行?

+1

你想通过第二行完成什么?你将如何使用'Foo'? –

+0

我打算在每个地方都用'Foo'替换'Bar '。 '酒吧'是一个很长的名字,来自typescript-collections包,'Foo'是一个更有意义的名字。 – iHowell

+1

你可以只键入Foo =栏;但我不确定这会起什么作用。除了某些地方的类型别名外,您不能使用该类型来创建新对象,例如,只能将其用作类型别名。 – toskv

回答

2

如果你需要的是别名Bar<X>式注释/在其他地方的提示(如function blah(foo: Bar<X>))。你可以使用下面的语句:

type Foo = Bar<X>; 

注意,你仍然不能做new Foo()中, type语句仅对TypeScript的“类型”部分有贡献,而对“值”部分不起作用(就像类一样)。

如果你想要一个实际的类,一个简单而有效的解决办法是延长原Bar<X>类,像这样:

class Foo extends Bar<X> {} 

我个人特别不喜欢这种解决方案虽然,因为它使你的代码不太清楚。

+0

有没有办法做第二部分,但不只是获取类型信息? – iHowell

+1

已编辑。再次,我不特别喜欢这个解决方案。 OO继承不应该用于别名。 –

1

您可以从Bar<X>继承Foo使一类中预定义的X类型参数:

class Foo extends Bar<X> {} 
1

您可以使用一个类型别名为@toskv建议:

type Foo = Bar<X>; 

然后你可以使用它作为一种类型:

let foo: Foo = new Bar<X>(); 

如果你有一个接受的X实例的构造方法,则编译器会推断出类型:

class Bar<T> { 
    constructor(x: X) { } 
} 

let foo: Foo = new Bar(); 

如果你想它绑定到特定的泛型约束一个新的类,那么你就需要做是这样的:

class Foo extends Bar<X> { ... } 

let foo = new Foo(); 
1

如果你需要的是一个类型别名那么你可以使用类型来创建这样说:

type Foo = Bar<X>; 

有了这个,你就可以不喜欢的事情:

let x: Foo; 

但不是:

let x= new Foo(); 

另一种解决方案是只延长酒吧和作出的空类。这不是真的如何使用类层次结构,但它可以满足您的需求。

class Foos extends Bar<number> { }