打字稿 - 表示任何类的类型?

时间:2016-10-11 11:33:09

标签: reflection typescript types

我应该在打字稿中使用什么类型来表示任何类?

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

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]);
  

A []'的类型'类型的论证不能分配给' ObjectConstructor []'。

类型的参数

然后我试过了:

suffle([typeof A, typeof B, typeof C, typeof D]);
  

错误TS2345:类型' string []'的参数不能分配给' ObjectConstructor []'类型的参数。     输入' string'不能分配给' ObjectConstructor'。

什么是正确的方法?泛型?怎么样?这不起作用:

export function <T extends typeof Object> shuffle(classes: T[]) : T[]

这两个:

export function <T extends Object> sortClassesBySpeciality(classes: typeof T[]) : typeof T[]

为什么typeof (typeof A)"string""" + typeof Afunction好的,得到这个,typeof有两个非常不同类型定义和表达的含义上下文。

(最终目标是按extends的{​​{1}}级别对类进行排序。)

1 个答案:

答案 0 :(得分:8)

您应该避免在打字稿中使用Object类型,最好将any用作the docs say

  

您可能希望Object扮演类似角色,就像在其他角色中一样   语言。但是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]);

code in playground

如果您的所有课程都基于超级课程(如您的示例所示),那么您可以这样做:

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]

code in playground