Typescript 类作为扩展另一个类的参数

问题描述 投票:0回答:1

我对 Typescript 和泛型相当陌生;我一定错过了一些希望微不足道的东西。

我试图传递一个(通用)类作为函数的参数,但这个类是从另一个特定的类扩展而来的

一个过于简单的例子如下:假设我有

class A { 
    static generate3() { return [new A(),new A(),new A()]; }
}

class B extends A {}
class C extends A {}

我想要一个方法,可以使用从 A 继承的任何类作为参数来调用该方法,并返回该静态方法的结果。类似的东西

f(B) // returns type B[]

我想我能做到

function f(type: typeof B){
    return type.generate3();
}

但这需要我提前定义好类。我也不能使用 typeof B|typeof C 因为在现实生活中有太多的类,这不实用 我试过了

function f2<T>(type: typeof T extends A){
    return type.hello();
}

其中

T
应该是类,但它会引发以下错误:
'T' only refers to a type, but is being used as a value here.

我认为这可行

function f3(type: typeof A){
    return type.generate3();
}

但是f3(B)的返回类型仍然是A[]而不是期望的B[] 我尝试将两者混合:

function f4<T extends A>(type: typeof A) : T[]{
    return type.generate3() as T[]; // cast it
}

但是

f4(B)
的返回类型仍然是
A[]
我不明白。谁能弄清楚我做错了什么吗?

typescript generics
1个回答
0
投票

在您的示例中,所有

A
B
C
都有一个静态方法
generate3() { return [new A(),new A(),new A()]; }
。 TypeScript 正确地告诉您,无论您调用
A.generate3()
B.generate3()
还是
C.generate3()
,这三个都将执行 JavaScript
return [new A(),new A(),new A()]
并返回三个
A

如果您希望

generate3
返回
A
以外的内容,则
generate3
不得直接引用
A

© www.soinside.com 2019 - 2024. All rights reserved.