Typescript 类可以实现可调用接口吗?

问题描述 投票:0回答:1

Typescript 接口允许定义函数风格的调用签名:

interface A {
    (x: number): number;
}

这可以通过例如一个函数:

const a: A = function(x: number): number {
    return 1;
}

是否可以使用类来实现这样的接口?

我尝试过这样的:

class B implements A {
    (x: number): number {
        return 1;
    }
}

但我收到此错误:

类“B”错误地实现了接口“A”。 “B”型不提供 匹配签名 '(x: number): number'.ts(2420)

有没有办法使用 Typescript 中的类来实现这种接口?

javascript typescript class interface es6-class
1个回答
0
投票

这是可能的。在我的项目中,我实现了一个与同名接口合并的

Callable
辅助类。需要与接口合并才能为 TypeScript 提供正确的函数签名类型:

export interface Callable<T extends unknown[] = unknown[], R = unknown> {
    (...args: T): R;
}

export class Callable<T extends unknown[] = unknown[], R = unknown> extends Function {
    public constructor(func: (...args: T) => R) {
        super();
        return Object.setPrototypeOf(func, new.target.prototype) as typeof this;
    }
}

使用这个类非常简单:

class Test extends Callable<[ number, number ], number> {
    public multiplier = 2;

    public constructor() {
        super((a, b) => (a + b) * this.multiplier);
    }
}

const test = new Test();
console.log(test(1, 2)); // Prints 6
test.multiplier = 3;
console.log(test(1, 2)); // Prints 9

一些解释:

  • 您可以在第一个类型参数中以数组的形式定义函数参数类型。在这种情况下,
    [ number, number]
    表示该函数需要两个数字参数。
  • 您将函数的返回类型定义为第二个类型参数。在这种情况下,这又是
    number
  • 将类实例作为函数调用时调用的实际函数传递给
    Callable
    超类的构造函数。
© www.soinside.com 2019 - 2024. All rights reserved.