如何解决如何在映射的打字稿函数签名中维护可选参数
我正在尝试编写经典 promisify
函数的类型安全版本。查看我的playground link here。
Node.js 风格的回调通常具有 (value?: ValueType,err?: ErrorType)
的形式。当然,它们也可以有内部可变参数形式,例如 (a?: A,b?: B,...,n?: N,err?: Error)
。覆盖第一种形式很容易。我发现,涵盖后者是很困难的。为什么?
嗯,我发现类型推断不适用于可选参数。
- 首先,为了获取节点回调的参数,我使用了
Parameters<MyCallbackType>
, - 其次,我尝试获取所有推断的回调参数直到最后一个参数,省略
err?: Error
参数。我正在调用包含除尾部之外的所有内容的数组切片Body
,并将其定义为:export type Body<T> = T extends [...infer B,infer _TailEl] ? B : never;
但是... Body<T>
在元组类型中有可选项目时效果不佳。问题是参数中的 arg n?: N
和 err?: Error
似乎没有在 infer
中被分区/考虑,因此我的条件类型查找失败,并且我已经超出了-运气。
我的技巧是Required
wrap Parameters<...>
,然后我可以成功获取回调的Body,并很好地将干净的回调签名反映回{{1}的返回值}.
一个很大的例外——promisify(fn)(args) => Promise<WellTypedTupleArgsFromCallback>
现在是一个元组,其中 一切都得到保证,因为 WellTypedTupleArgsFromCallback
是一种不诚实的类型。
这很容易在附加操场上的工作中看到,并且有一些测试来显示什么是正确的/不正确的。
如何使用可选元素正确映射可变参数回调主体?
解决方法
幸运的是,我的假设出错了。节点回调样式是 (err,...values),而不是相反。使用节点回调风格已经很久了,我忘记了正确的签名;)
这种正确的 arg 布局强制在用户空间将 err 输入为 null/undefined/Error/unknown,并消除了对可选 args 的歧视。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。