在将函数作为参数传递时如何添加类型安全性?

时间:2019-03-17 02:34:55

标签: typescript typescript-generics

我很好奇关于泛型的正确输入函数参数的方法。

看下面的基本示例,我有2个功能: -sayHellorunAnyFunction

现在,对sayHello的第一次调用显然是错误的,传递给函数的数据没有name参数。完美且值得期待。

问题出在下一部分,我们有一个函数runAnyFunction,该函数将一个函数作为其第一个参数,将obj作为其第二个参数,并简单地运行传递{{1} }作为参数。

下面的示例中的以下2个函数将通过打字稿检查没有问题,这就是我的问题。

obj

我知道第二个电话会给我一个runAnyFunction<Person>(sayHello, { name: "Bob" }); runAnyFunction<Monster>(sayHello, { size: "HUGE" }); ,这是不希望的。理想情况下,我希望此调用使类型检查失败,因为这是不允许的。

我的想法是罪魁祸首是Hello undefined函数参数,因为它自己的fn参数将被推断为obj,但是我很难为这个。

我知道在此演示中,我的any是一个实际上可以运行任何函数的函数,但是如果有一种键入这种性质的函数的首选方法,我很想知道。

如何正确输入?


代码示例

runAnyFunction

1 个答案:

答案 0 :(得分:3)

您还需要使Fn类型成为通用类型:

type Fn<T> = (obj: T) => string;
export function runAnyFunction<T>(fn: Fn<T>, obj: T): void {
    const res = fn(obj);
    console.log(res);
}

您之前没有收到错误的原因是您的Fn类型的隐式类型的第一个参数具有any类型:

type Fn = (obj) => string; // obj is implicitly of type any