打字稿泛型,未知的嵌套函数参数

时间:2019-03-08 15:41:55

标签: typescript generics

我对泛型函数有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”的输入类型,该怎么办?

谢谢

1 个答案:

答案 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是唯一必需的类型参数