为什么在以下代码中我可以分配具有与变量类型指定的签名不同的签名的函数?我应该如何更改Func
类型以不允许此类分配?
type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = () => Promise.resolve() // why no error although string argument is missing?
答案 0 :(得分:1)
基本上,发生的事情是Typescript不会强迫您键入不需要的函数参数。在您的情况下,即使您键入它们,方法的主体也不使用任何传递的参数。因此您可以跳过它们。
但是不允许以下情况:
type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = (a: boolean) => Promise.resolve()
因为现在函数签名肯定不匹配。
但是,您可以传递一部分参数。允许以下内容:
type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = (a: string) => Promise.resolve()
即使我们跳过...rest
参数,Typescript仍然接受函数签名。
这样想:如果您的函数签名没有定义参数,那么您也不能对传递给函数的参数进行任何计算。因此,不可能传递错误类型的参数。因此就Typescript而言,一切仍然是类型安全的:)