Reflection Typescript-表示任何类的类型?

Reflection Typescript-表示任何类的类型?,reflection,typescript,types,Reflection,Typescript,Types,我应该在typescript中使用什么类型来表示任何类 我试图编写一个函数,它接受一个类数组并返回一个不同顺序的数组 function shuffle(classes: typeof Object[]) : typeof Object[] { return ...; } class A { } class B extends A { } class C extends B { } class D extends B { } suffle([A, B, C, D]); “TypeOfA

我应该在typescript中使用什么类型来表示任何类

我试图编写一个函数,它接受一个类数组并返回一个不同顺序的数组

function shuffle(classes: typeof Object[]) : typeof Object[] {
    return ...;
}

class A { }
class B extends A { }
class C extends B { }
class D extends B { }
suffle([A, B, C, D]);
“TypeOfA[]”类型的参数不能分配给“ObjectConstructor[]”类型的参数

然后我试过:

shuffle([typeof A, typeof B, typeof C, typeof D]);
错误TS2345:类型为“string[]”的参数不能分配给类型为“ObjectConstructor[]”的参数。 类型“string”不可分配给类型“ObjectConstructor”

正确的方法是什么?仿制药?怎么用?这不起作用:

export function <T extends typeof Object> shuffle(classes: T[]) : T[]
导出函数洗牌(类:T[]):T[]
这两者都不是:

export function <T extends Object> sortClassesBySpeciality(classes: typeof T[]) : typeof T[]
export function sortClassesBySpeciality(类:typeof T[]):typeof T[]
还有为什么
typeof(typeof A)
“字符串”
“+typeof A
函数
?好的,明白了,
typeof
有两个非常不同的含义,类型定义上下文和表达式上下文


(最终目标是按照
对象
扩展
级别对类进行排序)

您应该避免在typescript中使用类型
对象
,您最好使用
任意
作为:

您可能期望对象扮演类似的角色,就像它在其他应用程序中一样 语言。但是Object类型的变量只允许您分配任何 对它们的价值-您不能对它们调用任意方法,即使是 实际上是存在的

但如果要表示类,则需要具有以下形式:

{ new (): CLASS_TYPE }
或者在您的情况下:

function shuffle(classes: Array<{ new (): any }>): Array<{ new (): any }> {
    return [];
}

class A { }
class B extends A { }
class C extends B { }
class D extends B { }
shuffle([A, B, C, D]);
函数洗牌(类:数组):数组{
返回[];
}
A类{}
类B扩展了{}
类C扩展了B{}
类D扩展了B{}
洗牌([A,B,C,D]);
()

如果您的所有类都基于一个超类(如您的示例所示),那么您只需执行以下操作:

function shuffle(classes: Array<{ new (): A }>): Array<{ new (): A }> {
    return [];
}
函数洗牌(类:数组):数组{
返回[];
}

编辑 只是看到你想

按扩展自对象的级别对类进行排序

要回答这个问题:

function shuffle(classes: Array<{ new (): any }>): Array<{ new (): any }> {
    return classes.sort((a, b) => getInheritanceLevel(a) - getInheritanceLevel(b));
}

function getInheritanceLevel(cls: { new (): any }): number {
    let level = 0;

    while (Object.getPrototypeOf(cls.prototype) !== Object.prototype) {
        level++;
        cls = Object.getPrototypeOf(cls.prototype).constructor;
    }

    return level;
}

shuffle([D, A, C, B]); // returns [A, B, D, C]
函数洗牌(类:数组):数组{
返回class.sort((a,b)=>getInheritanceLevel(a)-getInheritanceLevel(b));
}
函数getInheritanceLevel(cls:{new():any}):number{
设水平=0;
while(Object.getPrototypeOf(cls.prototype)!==Object.prototype){
级别++;
cls=Object.getPrototypeOf(cls.prototype).constructor;
}
回报水平;
}
洗牌([D,A,C,B]);//返回[A、B、D、C]

()

类型语法的意思是“其构造函数返回
A
”的类型,我说得对吗?所以Java中没有像
Class
那样的直接支持?这将如何与接口一起工作?它更像是一个“拥有一个构造函数的类型”,您还可以在那里定义静态类函数。我不认为有计划让它更像java方式,但是typescript方式缺少什么呢?它符合您的要求。此外,它也可以是
{new():any}[]
,这是等效的吗?我引入了一个别名:
键入AnyClass={new():any}是的,应该可以。惯例是调用这些构造函数,所以
键入AnyConstructor
,就像下面的结果一样-