如何在 Typescript 中正确扩展泛型类?

Posted

技术标签:

【中文标题】如何在 Typescript 中正确扩展泛型类?【英文标题】:How to properly extend a generic class in Typescript? 【发布时间】:2022-01-21 00:55:21 【问题描述】:

我已经创建了一个类:

export class TreeClient<T extends TreeItem, K extends keyof T> 

// ...


这个类有如下方法:

public setNodeProperty(nodeId: string, property: K, setter: (_value: T[K]) => T[K]): void
// ...

我试图用一个只有一个泛型的类来扩展这个类,如下所示:

export class DashboardBuilderClient<T extends TreeItem> extends TreeClient<T, keyof T> 

    constructor() 
        super();
    

但是一旦我尝试打电话:

const x = new DashboardBuilderClient<SomeType>();

x.setNodeProperty(nodeId, property, setter);

我得到错误:

Argument of type '(_value: T[K]) => T[K]' is not assignable to parameter of type '(_value: T[keyof T]) => T[keyof T]'.

我理解这个错误是由于将第二个泛型设置为keyof T 而不是K extends keyof T 之类的东西引起的,但是否可以只为包装类使用一个泛型以避免重复?

【问题讨论】:

【参考方案1】:
type TreeItem = 
    foo: string;


type MyTreeItem = Event & TreeItem & 
    bar: string;


export class TreeClient<T extends TreeItem, K extends keyof T> 
    public setNodeProperty(nodeId: string, property: K, setter: (_value: T[K]) => T[K]): void
    // ...
    


export class DashboardBuilderClient<T extends TreeItem> extends TreeClient<T, keyof T> 
    constructor() 
        super();
    


const x = new DashboardBuilderClient<MyTreeItem>();
x.setNodeProperty('nodeId', 'bar', (_value: MyTreeItem[keyof MyTreeItem]) => 'hello');

【讨论】:

以上是关于如何在 Typescript 中正确扩展泛型类?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript - 获取泛型类参数的类型

TypeScript泛型

TypeScript泛型

如何初始化这个泛型类

其参数扩展嵌套类的泛型类

泛型类继承和 LINQ 扩展方法