gpt4 book ai didi

typescript 不能转换为泛型类型变量

转载 作者:行者123 更新时间:2023-12-04 02:59:02 24 4
gpt4 key购买 nike

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

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

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'.

最佳答案

由于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到只有 type 的类型和 payload您可以使用类型约束来指定属性 typepayload存在于 F如果存在任何其他属性,则它们的类型为 never :
function action<F extends { type : string, payload : any} & { [P in Exclude<keyof F, 'type' | 'payload'>]: never }>(type: string, payload: any): F {
return { type, payload } as any;
}
const Login = (credentials: credentials) => action<Login>(LOGIN_REQUEST, credentials);
action<{ type: string; payload: any; otherMandatoryProp: boolean }>(LOGIN_REQUEST, {}) // invalid call

关于 typescript 不能转换为泛型类型变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51018294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com