TypeScript:通过extends泛型自动返回类型的函数类型



我尝试使返回父类型的子类型函数;我们有…

class X { }
class A extends X {
hi() { ... }
}
class B extends X {
hello() { ... }
}
type Foo<T extends X = X> = () => T;

然后,我写了各种函数

const fa: Foo = () => {
return new A();
}
const fb: Foo = () => {
return new B();
}
然后,我将结果存储在变量 中
const a = fa();
const b = fb();

但是,如果我尝试调用类A和类B的自有方法,就不会。因为所有类型都是X

a.hi() // error
b.hello() // error

如果不能手动设置泛型,如a = fa<A>(),如何纠正这个错误?

谢谢!

让我们从class X开始。这个类没有任何方法。

您希望Foo接受一个默认值为X的通用参数。

由于您已经定义了Foo类型的fafb函数,没有显式的泛型参数,因此已应用默认值。

实际上,每个函数的类型都是Foo<X>。因为X没有任何方法,所以不允许调用它们。

如果你想创建一个函数返回任何继承自X的类,考虑这个例子:

class X {
tag: 'X' = 'X'
}
class A extends X {
hi() { }
}
class B extends X {
hello() { }
}
class C {}
const fa = () => {
return new A();
}
const fb = () => {
return new B();
}
const x = <T extends typeof X>(arg: T) => new arg();
const a = x(A) // ok
const b = x(B) // ok;
const c = x(C) // error

游乐场

请记住,TS有结构类型系统,这意味着class X{}class C{}从类型的角度来看是相等的。为了确保TS能够区分它们,您需要向X添加一些属性。我添加了tag

最新更新