我不明白为什么TypeScript在解析时不会抱怨:
type numNumToNum = (x: number, y: number) => number;
const add3 : numNumToNum = n => n+3;
类型别名numNumToNum
被定义为数字的二进制函数。但是add3接受一元函数,尽管(错误地)键入了numNumToNum。
我想念什么?
答案 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;