首页 > 解决方案 > 从继承的类型访问泛型

问题描述

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

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在签名之后有一个抽象方法

public abstract foo(thing: string): number;

举个例子。

我考虑过的另一种选择:在Baz内部constructor而不是作为泛型类型传递......但是,实际上仍然存在从Baz自身获取泛型类型的问题。

编辑 2:实际用例

好的,所以我有这两个课程。

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;
}

我将有几个*Handlers 在其中将扩展的实例Storage作为泛型传递。现在显然我不能神奇地插入Kand V,我可以做的是 haveHandler<K, V>然后 pass <string, Command>,但我希望我可以简单地传递 *Storage 的实例,而不是每次都再次传递 2 种类型。

标签: typescript

解决方案


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

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

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

这有点像怪物,但使用类型变量会很快失控。


推荐阅读