在Typescript中不可能使用MetaClasses

时间:2016-03-03 00:22:06

标签: typescript

例如,以下内容不会编译(link to typescript playground example)

declare class ClassFactory {
    constructor();
    new(): any;
}

const User = new ClassFactory();
const user = new User();

结果错误:

Cannot use 'new' with an expression whose type lacks a call or construct signature.

我需要额外的注释吗?我如何声明MetaClass?我假设new(): any;被认为是类的原型方法,因此是实例构造模式。

编辑:固定链接

1 个答案:

答案 0 :(得分:4)

他们是可能的。这是一个简单的例子:

declare class User{}
declare interface ClassFactory {
    new(): typeof User;
}
declare var ClassFactory: ClassFactory;

const UserClass = new ClassFactory();
const user = new UserClass(); // user has type `User`

各部分的说明

  • 要声明“使用new调用此内容将返回”您无法使用class。因此interface ClassFactory
  • 要从变量命名空间中使用此类声明,您需要一个变量。因此var ClassFactory
  • 要说某事是class而不是实例,你不能做: User,你需要获得类的类型。因此typeof User

更多

这里使用的一个关键概念是声明空间。这包括在内:https://basarat.gitbooks.io/typescript/content/docs/project/declarationspaces.html