Ond*_*žka 7 reflection 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]);
Run Code Online (Sandbox Code Playgroud)
类型'typeof A []'的参数不能分配给'ObjectConstructor []'类型的参数.
然后我试过了:
shuffle([typeof A, typeof B, typeof C, typeof D]);
Run Code Online (Sandbox Code Playgroud)
错误TS2345:类型'string []'的参数不能分配给'ObjectConstructor []'类型的参数.类型'string'不能分配给'ObjectConstructor'类型.
什么是正确的方法?泛型?怎么样?这不起作用:
export function <T extends typeof Object> shuffle(classes: T[]) : T[]
Run Code Online (Sandbox Code Playgroud)
这既不是:
export function <T extends Object> sortClassesBySpeciality(classes: typeof T[]) : typeof T[]
Run Code Online (Sandbox Code Playgroud)
也就是为什么好吧,得到这个,typeof (typeof A)
是"string"
和"" + typeof A
是function
?typeof
有两个非常不同的类型定义和表达的含义上下文.
(最终目标是通过一级类排序extends
从Object
.)
您应该避免使用类型Object
的打字稿,你最好使用any
作为文档说:
您可能希望Object扮演类似的角色,就像在其他语言中一样.但是Object类型的变量只允许你为它们分配任何值 - 你不能在它们上调用任意方法,即使是实际存在的方法
但是如果你想表示类,那么你需要有以下形式:
{ new (): CLASS_TYPE }
Run Code Online (Sandbox Code Playgroud)
或者在你的情况下:
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]);
Run Code Online (Sandbox Code Playgroud)
(游乐场代码)
如果你的所有类都基于超类(如你的例子所示),那么你可以简单地做:
function shuffle(classes: Array<{ new (): A }>): Array<{ new (): A }> {
return [];
}
Run Code Online (Sandbox Code Playgroud)
刚看到你想要的
按对象的扩展级别对类进行排序
要回答这个问题:
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]
Run Code Online (Sandbox Code Playgroud)
(游乐场代码)
归档时间: |
|
查看次数: |
3181 次 |
最近记录: |