typescript接受一元fn,尽管它是二进制的

typescript接受一元fn,尽管它是二进制的,typescript,Typescript,我不明白为什么TypeScript在解析时不抱怨: type numNumToNum = (x: number, y: number) => number; const add3 : numNumToNum = n => n+3; 类型别名numNumToNum定义为数字上的二进制函数。但是add3接受一元函数,尽管(错误地)输入为numNumToNum 我遗漏了什么?如果我们将函数定义为 const add3:numnumnum=(n,未使用)=>n+3 它是否满足接口要求?是的

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

type numNumToNum = (x: number, y: number) => number;
const add3 : numNumToNum = n => n+3;
类型别名
numNumToNum
定义为数字上的二进制函数。但是add3接受一元函数,尽管(错误地)输入为numNumToNum


我遗漏了什么?

如果我们将函数定义为

const add3:numnumnum=(n,未使用)=>n+3

它是否满足接口要求?是的。因此,想象一下,
notUsed
变量已经存在。不强迫开发人员添加无用的参数是一个特性,而不是一个bug

更严格地说,如果我们可以将
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;
数组(元组):


所以我能做的是:
键入pairOfNumbers=[number,number];类型numNumToNum=(xy:pairOfNumbers)=>number;常量add:numNumToNum=(xy:pairOfNumbers):number=>xy[0]+xy[1]@TerenceS。是的,你说得对。请参阅我的编辑。我个人更喜欢用对象包装而不是数组,因为参数名可以提供一些文档,但我想数学函数也可以。(在任何情况下,这都是个人偏好的问题)但仍然存在一个问题:我将所有参数包装在一个对象或元组中,但我仍然可以定义一个完全不带参数的函数:
const add:numNumToNum=()=>42
。。。
type numNumToNum = (xy: [number, number]) => number;
const add3: numNumToNum = ([x, y]: [number, number]) => x+y+3;