我对 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[]
我不明白。谁能弄清楚我做错了什么吗?
在您的示例中,所有
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
。