【问题标题】:How to properly extend a generic class in Typescript?如何在 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 之类的东西引起的,但是否可以只为包装类使用一个泛型以避免重复?

【问题讨论】:

    标签: typescript typescript-typings typescript-generics typescript-class


    【解决方案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');
    

    【讨论】:

      猜你喜欢
      • 2021-03-25
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2015-04-01
      • 2023-01-12
      • 1970-01-01
      • 2021-02-07
      • 2013-09-30
      相关资源
      最近更新 更多