typescript 泛型的类型脚本抽象方法:“类定义示例成员属性,但扩展类将其定义为示例成员函数”

bihw5rsg  于 2023-02-13  发布在  TypeScript
关注(0)|答案(1)|浏览(145)

给定以下内容(操场链接):

abstract class Base<F extends () => void> {
    public abstract __call__: F;
}

type CallSignature<T> = {
    (): T;
    (value: T): void;
}

class Foo<T> extends Base<CallSignature<T>> {
    public __call__(): T;
    public __call__(value: T) : void;
    public __call__(value?: T) {
        return value;
    }
}

我得到这个错误:

Class 'Base<CallSignature<T>>' defines instance member property '__call__', but extended class 'Foo<T>' defines it as instance member function.(2425)

我如何指定Base中的__call__是一个方法,同时仍然让它的定义来自T(例如,允许任意签名,包括重载)?
请注意,Base不允许直接引用CallSignature,因为对于不同的子类,这将是不同的接口(因此它作为F传递)。
此外,这个问题的要点是Base应该负责Foo需要实现什么接口,即使Foo传递了一个以某种方式定制它的泛型。

ljo96ir5

ljo96ir51#

您可以使用ParametersReturnType帮助器重新创建__call__方法的类型,而不是引用它的类型。

abstract class Base<T extends { __call__: () => void }> {
    public abstract __call__(...args: Parameters<T['__call__']>): ReturnType<T['__call__']>;
}

interface Callable<T> {
    __call__(): T;
    __call__(value: T): void;
}

class Foo<T> extends Base<Callable<T>> {
    public __call__(): T;
    public __call__(value: T) : void;
    public __call__(value?: T) {
        return value;
    }
}

相关问题