我想定义一个函数,作为参数获取另一个函数f及其参数args,我想让Typescript确保传递的参数对于传递的函数是正确的.

伪代码

function A (n: number, s: string, b: boolean) {
  ...
}

function B (f: Function, ...args: typeof arguments of f) {
  ...
  f(args)
}

B(A, 1, 'str', true) // typescript is happy
B(A, 1, 'str') // typescript is sad
B(A, 1, undefined, true) // typescript is sad
// any other example of wrong arguments of A passed to b would raise Typescript error...

所以这里重要的部分是:

...args: typeof arguments of f

这显然是not个有效的打字脚本.

我怎样才能写出这样的打字脚本代码呢?

推荐答案

可以使用Parameters实用程序类型来实现这一点.

例如

function B<T extends (...args: any) => any> (f: T, ...args: Parameters<T>) {
  f(args)
}

Here is a playground显示您预期的错误.

请注意,此判断仅在编译时进行,在TypeScript编译为JavaScript后不会提供任何运行时保护.如果需要运行时保护,则需要使用arguments对象并编写一些自定义代码来验证传递的参数的数量和类型.大概是this.

Typescript相关问答推荐

Angular -使用Phone Directive将值粘贴到控件以格式化值时验证器不工作

TypScript如何在 struct 上定义基元类型?

防止获取发出不需要的请求

为什么typescript不能推断类的方法返回类型为泛型''

如何在排版中正确键入中间件链和控制器链

如何将联合文字类型限制为文字类型之一

react 路由6操作未订阅从react 挂钩表单提交+也不使用RTK查询Mutations

如何判断对象是否有重叠的叶子并产生有用的错误消息

如何在编译时为不带常量的参数引发错误

如何将所有props传递给React中的组件?

如何在Reaction Query Builder中添加其他字段?

Typescript .根据枚举输入参数返回不同的对象类型

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

如何实现允许扩展泛型函数参数的类型

如何使对象同时具有隐式和显式类型

我如何键入它,以便具有字符串或数字构造函数的数组可以作为字符串或数字键入s或n

JSX.Element';不可分配给类型';ReactNode';React功能HOC

如何在Vuetify 3中导入TypeScript类型?

如何使用动态生成的键和值定义对象的形状?

如何使用布尔值构建对象 TYPE,但至少有一个必须为 true