Typescript可以防止将期望更多参数的函数(作为参数传递给另一个函数)传递给函数。但是当确实要获得比预期更多的参数时,它不会阻止传递函数。
这是(SSCCE)代码:
const takesFnWith3args = (fn3args: (a1: boolean, a2: number, a3: string) => void): void => {
// See, it isn't `a3?: boolean` it's `a3: boolean`!!
const importantKey = 'Very important parameter';
fn3args(true, 1, importantKey);
}
const fn2args = (a1: boolean, a2: number): void => {
console.log('I don\'t see any keys around here');
}
const fn4args = (a1: boolean, a2: number, a3: string, a4: string): void => {
console.log('I have 4 arguments');
}
takesFnWith3args(fn2args); // Not an error <-- Here is the problem!
takesFnWith3args(fn4args); // Error
如何强制仅接受指定的函数类型?我不知道如何使TS强制执行fn2args
不能作为参数传递给takesFnWith3args
函数。
据我了解,鸭式输入之所以起作用,是因为函数子类型与参数子类型之间的contravariance。
即fn2args
<=
fn3args
是因为args of fn2args
>=
args of fn3args
和 output of fn2args
<=
{ {1}}。 (“ output of fn3args
”的意思是“ 是的子类型”)
但是如何防止这种行为?可能吗我的用例是,当我更改组件内部的功能规范时,使编译器对我有所帮助。然后,我被告知我没有处理多余的参数,应该在程序按预期工作之前加以解决。