我正在尝试从另一个类访问泛型,该类将作为泛型本身传递。
export default abstract class Foo<K, V> {}
import Foo from './Foo';
export default abstract class Bar<Foo> {}
如何访问K
类中的V
和Bar
?我想创建一个使用这些类型的抽象方法,但不确定如何实际访问嵌套的泛型。
编辑:添加了用例以进一步阐明
用例示例:
export default class Baz extends Foo<string, number> {}
import Baz from './Baz';
export default class Qux extends Bar<Baz> {}
我希望Bar
类认识到Qux
应该包含泛型<string, number>
,因为我想在Bar
中有一个跟随签名的抽象方法< / p>
public abstract foo(thing: string): number;
以为例。
我考虑过的另一种方法是:在Baz
内传递constructor
而不是将其作为通用类型...但是,实际上仍然存在从{{1 }}本身。
编辑2:实际用例
好的,我有这两个课程。
Baz
export default abstract class Storage<K, V> {
protected abstract _init(): void;
}
问题出在这里
import Data from '../structures/bases/Data';
export default class DataStore extends Storage<string, Data> {
protected async _init(): void {
// ...
}
}
import Data from '../structures/bases/Data';
export default class DataHandler extends Handler<DataStore> {
public abstract get(key: string): Data {
//...
}
}
我将有几个export default abstract class Handler<K, V> {
// my goal, where K is string and V is Data when DataStore is passed
public abstract get(key: K): V;
}
,我将在其中传递扩展*Handler
的实例作为泛型。现在显然我无法神奇地插入Storage
和K
,我想可以做的是我想拥有V
然后通过Handler<K, V>
,但是我希望可以简单地传递* Storage实例,而不是每次都再次传递这两种类型。
答案 0 :(得分:2)
您对Bar
的定义不正确。它应该看起来像这样:
import Foo from './Foo';
export default abstract class Bar<K, V, F extends Foo<K,V>> {}
您原来的Foo
是bar内的类型变量,而不是您要成为的Foo
类。然后K
和V
绑定到Foo实例的类型变量。现在,所有类型变量都可以在您的Bar
实例中使用
这有点像怪物,但是使用类型变量可以很快失去控制。