使用 SWRMutation 触发器在一个通用函数包裹时无法调用
虫子报告
□ 描述/观察行为
当将“使用SWRMutation”包在一个通用的帮助函数中时,“触发”返回类型就变成了“Trigger Without Args + Trigger With Optimes Args + TriggerWith Args + TriggerWith Args”的不可调用的联盟。
TypeScript 错误 :
TS2349:此表达式不可调用.
工会的每个成员
“ Trigger Without Args <Data, any, key, args > 与可选的Args <Data, any, key, args > \ TriggerWith Args <...>”
拥有签名,但这些签名都没有相互兼容。决定触发接口使用的有条件类型 :
触发: [ExtraArg] 延伸 [永远] 切换出Args <... > : IsUnguided Includingd 扩展为真 以可选参数触发 <... > : TriggerWithArgs <... >
当“ExtraArg”是通用类型参数(尚未解决)时,无法评价。 TypeScript **deders ** 有条件的类型,而不是将其溶解为单一分支. 被推迟的类型不透明,无法调用,因为TS无法确定三种不兼容的调用签名中哪一种适用.
注:`[ExtraArg]延伸[绝不]'包装正确地阻止了工会的分会——这是一个延期的有条件类型问题,而不是分配性有条件类型问题.
□ 预期行为
" 触发器 " 在通用包装功能中使用时,应可调用。
□ 重推步骤/ 代码示例
从“ swr/ mutation” 导入用户 SWRMutation
从“ swr/ mutation” 导入类型 { mutationFatcher }
导出用户 获取 = <
键扩展字符串=字符串,
数据=未知,
args = 不详,
>( 单词
键: 键,
获取器: MutationFatcher <Data, key, args >
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你还不知道 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}
const {触发 } = 使用 SWRMutation( 键, 取取器)
//TS2349:此表达式不可调用.
触发( { someArg: "value" })
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?目前,要求``期望-过度 ' 工作。
□ 附加上下文
SWR版本: 2.2.4 (也转载于 2.4.1)
在https://GitHub.com/Vercel/swr/pull/2604中介绍了三相分法。
有关问题:
- https://GitHub.com/Vercel/swr/issues/2755——自定义钩断开的触发类型(按出口类型确定,但根本的推迟有条件问题没有解决)
- https://GitHub.com/Vercel/swr/issues/4164——难以用型号安全包装SWR钩.
- https://GitHub.com/Vercel/swr/issues/2126——一般收集者推论问题
□提议修补
将三个独立的接口( " TriggerWithout Args " 、 " TriggerWith Optimes Args " 、 " TriggerWith Args " )合并成一个单一的接口,使用有条件的休息参数。 这把条件推入了参数位置,其中TypeScript处理更优雅地推迟——所有分支都共享一个具有同一种回放类型的可调用签名.
界面 Trigger <Data, 出错, SWRMutationKey 扩展密钥, ExtraArg > { / 抛出错误: 真 < SWRData = 数据> ( ...args: [extraArg] 延伸[永远不] ? [选项 : SWRMutation 配置 < SWRData, 错误, SWRMutation Key, extraArg > & . . . . . . .
内容来源: vercel/swr