我对泛型函数有som问题,该泛型函数具有将未知参数作为参数的函数。
export const inject = <I,V>(fn:<U>(input?:U) => V, resolveWithPayload: boolean, resolveArgs?: I) => <R>(payload:R):R => {
resolveWithPayload ? fn(payload) : resolveArgs ? fn(resolveArgs) : fn();
return payload;
};
const fn = (value:number):number => {
propertyToMutate = value;
return propertyToMutate;
}
const res =_fish.inject(fn,false,60)(50);
but calling it ends with :
'(value:number)=> number类型的参数不能分配给 '(input ?: U)=>数字类型的参数。参数类型 “值”和“输入”不兼容。类型“ U”不可分配 键入“数字”。
如果我以此方式更改代码:
export const inject = <I,V,U>(fn:(input?:U) => V, resolveWithPayload: boolean, resolveArgs?: I) => <R>(payload:R):R => {
resolveWithPayload ? fn(payload) : resolveArgs ? fn(resolveArgs) : fn();
return payload;
};
以类型定义错误结束,注入本身如下:
TS2345:类型'R'的参数不能分配给类型的参数 “ U”。
TS2345:类型'I'的参数不能分配给类型的参数 “ U”。
那么,如果我不知道“ fn”的输入类型,该怎么办?
谢谢
答案 0 :(得分:0)
第一个错误是由于inject需要具有签名<U>(input?: U) => V
的函数,而您提供的函数具有签名(value: number) => number
。换句话说,inject
期望fn
是类型U
的泛型函数,该类型接受类型U | undefined
的参数,但是您传递的fn
接受类型为number
的参数。
很难知道您要使用所有这些泛型到底要完成什么,但是也许您正在寻找这样的东西:
export const inject = <U>(fn:(input?:U) => U, resolveWithPayload: boolean, resolveArgs?: U) => (payload:U):U => {
resolveWithPayload ? fn(payload) : resolveArgs ? fn(resolveArgs) : fn();
return payload;
};
const fn = (value:number = 0):number => {
propertyToMutate = value;
return propertyToMutate;
}
请注意,number
是唯一必需的类型参数