首页 文章

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

提问于
浏览
7

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

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

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

类型'typeof 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 A是什么功能?好吧,得到这个, typeof 有两个非常不同的类型定义和表达的含义上下文 .

(最终目标是从 Object 开始按级别 extends 排序 . )

1 回答

  • 6

    你应该避免在typescript中使用 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

相关问题