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 中的类来实现这种接口?
这是可能的。在我的项目中,我实现了一个与同名接口合并的
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
超类的构造函数。