我很好奇关于泛型的正确输入函数参数的方法。
看下面的基本示例,我有2个功能:
-sayHello
和runAnyFunction
现在,对sayHello
的第一次调用显然是错误的,传递给函数的数据没有name
参数。完美且值得期待。
问题出在下一部分,我们有一个函数runAnyFunction
,该函数将一个函数作为其第一个参数,将obj
作为其第二个参数,并简单地运行传递{{1} }作为参数。
下面的示例中的以下2个函数将通过打字稿检查没有问题,这就是我的问题。
obj
我知道第二个电话会给我一个runAnyFunction<Person>(sayHello, {
name: "Bob"
});
runAnyFunction<Monster>(sayHello, {
size: "HUGE"
});
,这是不希望的。理想情况下,我希望此调用使类型检查失败,因为这是不允许的。
我的想法是罪魁祸首是Hello undefined
函数参数,因为它自己的fn
参数将被推断为obj
,但是我很难为这个。
我知道在此演示中,我的any
是一个实际上可以运行任何函数的函数,但是如果有一种键入这种性质的函数的首选方法,我很想知道。
如何正确输入?
代码示例
runAnyFunction
答案 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