首页 > 解决方案 > 使用泛型类型接口泛型类型类

问题描述

这是一个纯粹的打字稿/泛型问题。我的问题来源于 Angular/CDK (portal.d.ts):

/** Interface that can be used to generically type a class. */
export interface ComponentType<T> {
    new (...args: any[]): T;
}

我正在努力解决这个问题,到目前为止还没有太多运气。从我写的测试代码可以看出问题是这样理解的:

export interface ComponentType<T> {
    new (...args: any[]): T;
}

interface Bar<T> {
    getData: () => T
}

class MyBooleanComponent implements Bar<boolean> {
    getData(): boolean { return true; }
}


class MyGenericWrapper {
    init<T>(comp: ComponentType<T>): T {
        return new comp();
    }
}

const wrapper = new MyGenericWrapper();
const instance = wrapper.init<boolean>(MyBooleanComponent);

(instance as Bar).getData();

代码

在此处输入图像描述

可以看出,这段代码存在一些问题。

首先,MyBooleanComponent,它不能分配给ComponentType<boolean>。我不清楚如何判断 MyBooleanComponent` 返回布尔值?

其次,如果我(instance as Bar).getData();对打字稿编译器不满意Bar,它想要,(instance as Bar<boolean>).getData();但我希望根据我如何初始化/设置整个事情,它应该有可能得到boolean正确的?

如果我做错了什么或者试图做不可能的事情,我就不会使用。任何帮助,将不胜感激!

标签: typescriptgenericstypescript-generics

解决方案


我认为令人困惑的是 type TinMyGenericWrapper与 type Tin interface不同Bar。您已通过以下方式将 interfaceBar的泛型类型设置为 boolean MyBooleanComponenet

class MyBooleanComponent implements Bar<boolean> {
    getData(): boolean { return true; }
}

asMyGenericWrapper的泛型类型设置为MyBooleanComponent

const wrapper = new MyGenericWrapper();
const instance = wrapper.init<MyBooleanComponent>(MyBooleanComponent);
instance.getData();

工作示例。


推荐阅读