广义 Class 的打字稿别名实例

Typescript Alias Instance of Generalized Class

我目前正在尝试为通用 class 添加别名。我正在使用 typescript-collections 包并想做一些重命名。

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

第二行我该怎么办?

如果您只需要在其他地方为 annotations/hints 类型别名 Bar<X>(例如 function blah(foo: Bar<X>)),您可以使用以下语句:

type Foo = Bar<X>;

请注意,您仍然无法执行 new Foo()type 语句仅有助于 TypeScript 的 "types" 部分,而不会影响 "values" 部分(就像 class 那样)。

如果您想要一个实际的 class,一个简单有效的解决方案是扩展原始的 Bar<X> class,如下所示:

class Foo extends Bar<X> {}

不过,就个人而言,我并不是特别喜欢这个解决方案,因为它会使您的代码不那么清晰。

您可以从 Bar<X> 继承 Foo 以使用预定义的 X 类型参数创建 class:

class Foo extends Bar<X> {}

您可以按照@toskv 的建议使用类型别名:

type Foo = Bar<X>;

那你就可以把它当作类型来使用了:

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

如果您有一个接收 X 实例的构造函数,那么编译器将推断类型:

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

let foo: Foo = new Bar();

如果您想要一个绑定到特定通用约束的新 class,那么您需要执行以下操作:

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

let foo = new Foo();

如果您只需要一个类型别名,那么您可以使用类型以这种方式创建它:

type Foo = Bar<X>;

有了它,您将能够执行以下操作:

let x: Foo;

但不是:

let x= new Foo();

另一种解决方案是只扩展 Bar 并创建一个空的 class。这并不是您应该如何使用 class 层次结构,但它可以满足您的需求。

class Foos extends Bar<number> { }