打字稿接受一元fn,尽管键入二进制

时间:2018-09-02 22:25:51

标签: typescript

我不明白为什么TypeScript在解析时不会抱怨:

type numNumToNum = (x: number, y: number) => number;
const add3 : numNumToNum = n => n+3;

类型别名numNumToNum被定义为数字的二进制函数。但是add3接受一元函数,尽管(错误地)键入了numNumToNum。

我想念什么?

1 个答案:

答案 0 :(得分:1)

以这种方式思考,如果我们将函数定义为

const add3 : numNumToNum = (n, notUsed) => n+3

它满足界面要求吗?是的。因此,请想象notUsed变量已经存在。不强迫开发人员添加无用的参数是功能,而不是错误。

更严格地说,如果我们可以将类型B的对象传递给A的使用者,则类型B会实现类型A,而使用者将不知道区别。这就是这里的情况。

type numNumToNum = (x: number, y: number) => number;
const add3 : numNumToNum = n => n+3;

function applyNumNumToNum(fn: numNumToNum, a: number, b: number): number {
  return fn(a,b);
}

const foo: number = applyNumNumToNum((x,y) => x*y, 2,3); //this is valid
const bar: number = applyNumNumToNum(add3, 2,100000); //this is also valid. applyNumNumToNum doesn't care about our implementation and the fact that `1000000` isn't used

如果您确实要强制执行参数的数量,则始终可以传递包装在对象或数组中的参数。

在对象中包装参数:

type numNumToNum = ({x: number, y: number}) => number;
const add3: numNumToNum = ({x,y}: {x: number, y: number}) => x+y+3;

数组(元组):

type numNumToNum = (xy: [number, number]) => number;
const add3: numNumToNum = ([x, y]: [number, number]) => x+y+3;