我尝试使返回父类型的子类型函数;我们有…
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
类型的fa
和fb
函数,没有显式的泛型参数,因此已应用默认值。
实际上,每个函数的类型都是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