首页 > 解决方案 > 具有指定参数的函数

问题描述

为什么在下面的代码中我可以分配与变量类型指定的签名不同的函数?我应该如何更改Func类型以不允许此类分配?

type Func = (a: string, ...rest: any[]) => Promise<any>;
let f: Func = () => Promise.resolve() // why no error although string argument is missing?

标签: typescript

解决方案


基本上正在发生的事情是 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 而言,一切仍然是类型安全的 :)


推荐阅读