如何实现具有多个未命名函数成员的接口?

时间:2019-06-06 21:32:28

标签: typescript

js-quantities库具有swiftConverter()方法,该方法生成将数字从一个单位制转换为另一种单位制(例如,英尺到米)的函数。该函数可以使用numbernumber[],并分别返回转换后的numbernumber[]

@types/js-quantities中定义的接口是:

interface Converter {
    (sourceValue: number): number;
    (sourceValues: number[]): number[];
}

我想写一个返回符合此接口值的方法。我该怎么做?

您不能简单地编写形式为(value: number | number[]): number | number[]的函数,因为映射number | number[] => number | number[]的函数与映射number => numbernumber[] => number[]的函数有细微的区别。 / p>

1 个答案:

答案 0 :(得分:1)

具有重载的函数将满足该接口:

interface Converter {
    (sourceValue: number): number;
    (sourceValues: number[]): number[];
}

function convert(sourceValue: number): number;
function convert(sourceValues: number[]): number[];
function convert(sourceValues: number | number[]): number | number[] {
  return sourceValues;
}

let conv: Converter;
conv = convert;

实现签名仍然可以自由地做不安全的事情,但这就是重载的本质。

或者,如果您愿意,可以有一个实现接口的方法。由于此接口具有函数签名,因此一个类无法实现它,但是该类的方法可以提供所有必要的重载。

class X {
  convert(sourceValue: number): number;
  convert(sourceValues: number[]): number[];
  convert(sourceValues: number | number[]): number | number[] {
    return sourceValues;
  }
}

let conv: Converter;
conv = new X().convert;