打字稿无法转换为通用类型变量

时间:2018-06-25 07:32:11

标签: typescript redux

我想创建一个通用函数来在typescript-redux中创建动作。

我想要的是使用将接口作为类型变量的函数。所以我从这个功能开始:

function action<F>(type: string, payload: any): F {
    return { type, payload };
}

我想这样使用它:

interface Login {
    type: LOGIN_REQUEST;
    payload: credentials;
}

const Login = (credentials: Credentials) 
     => action<Login>(LOGIN_REQUEST, credentials);

问题是有此错误:

Type '{ type: string; payload: any; }' is not assignable to type 'F'.

3 个答案:

答案 0 :(得分:3)

由于action是通用的,因此编译器确实无法知道对象文字{ type: string; payload: any; }将满足类型F。此代码也将是有效的调用:

action<{ type: string; payload: any; otherMandatoryProp: boolean }>(LOGIN_REQUEST, credentials);
在上述情况下,

F包含action无法填充的其他字段。

最简单的解决方案是在这种情况下突破类型安全沙箱并使用类型断言:

function action<F>(type: string, payload: any): F {
    return { type, payload } as any;
}

此版本仍允许使用{ type: string; payload: any; otherMandatoryProp: boolean }进行呼叫,这可能使某些人对重新调整的对象上的哪些字段进行一些假设。如果要将F限制为仅包含typepayload的类型,则可以使用类型约束,该约束指定typepayload的属性存在于{ {1}},如果存在其他任何属性,则它们的类型为F

never

答案 1 :(得分:0)

打字稿返回值应与您要返回的对象匹配 它应该是login类型(或者您可以将其设置为任何类型)

function action<F>(type: string, payload: any): Login  {
    return { type, payload };
}

答案 2 :(得分:0)

因为您不会返回任何值,而只返回function action<F extends Login>(type: string, payload: any): F { return { type, payload } as F; } ,所以需要添加一个约束:

wmic