Typescript -表示任何类的类型



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

我正在尝试写一个函数,它接受一个类数组并返回一个不同顺序的数组。

function shuffle(classes: typeof Object[]) : typeof Object[] {
    return ...;
}
class A { }
class B extends A { }
class C extends B { }
class D extends B { }
shuffle([A, B, C, D]);

类型'typeof A[]'的实参不能赋值给类型'ObjectConstructor[]'的形参。

Then I've try:

shuffle([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有两个非常不同的含义类型定义和表达上下文

(最终目标是按extendsObject的级别对类进行排序)

您应该避免在typescript中使用Object类型,您最好使用any,因为文档中说:

您可能期望Object扮演类似的角色,就像它在other中所做的那样语言。但是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 [];
}

编辑

刚刚看到你想

根据对象

的extends级别对类进行排序

回答:

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)

相关内容

  • 没有找到相关文章

最新更新