从继承的类型访问泛型

时间:2019-05-12 21:15:47

标签: typescript

我正在尝试从另一个类访问泛型,该类将作为泛型本身传递。

export default abstract class Foo<K, V> {}
import Foo from './Foo';
export default abstract class Bar<Foo> {}

如何访问K类中的VBar?我想创建一个使用这些类型的抽象方法,但不确定如何实际访问嵌套的泛型。

编辑:添加了用例以进一步阐明

用例示例:

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的实例作为泛型。现在显然我无法神奇地插入StorageK,我想可以做的是我想拥有V然后通过Handler<K, V>,但是我希望可以简单地传递* Storage实例,而不是每次都再次传递这两种类型。

1 个答案:

答案 0 :(得分:2)

您对Bar的定义不正确。它应该看起来像这样:

import Foo from './Foo';
export default abstract class Bar<K, V, F extends Foo<K,V>> {}

您原来的Foo是bar内的类型变量,而不是您要成为的Foo类。然后KV绑定到Foo实例的类型变量。现在,所有类型变量都可以在您的Bar实例中使用

这有点像怪物,但是使用类型变量可以很快失去控制。