如何在映射的typescript函数签名中维护可选参数
我正在尝试编写经典的如何在映射的typescript函数签名中维护可选参数,typescript,variadic,mapped-types,Typescript,Variadic,Mapped Types,我正在尝试编写经典的promisify函数的类型安全版本。看我的 Node.js样式的回调通常采用(value?:ValueType,err?:ErrorType)的形式。当然,它们也可以具有内部变量形式,例如(a:a,b:b,…,n:n,err?:Error)。覆盖第一个表单很容易。我发现,覆盖后者是困难的。为什么? 我发现类型推断不能很好地处理可选参数 首先,为了获取节点回调的参数,我使用了parameters 其次,我尝试获取所有推断的回调参数,直到最后一个参数,忽略err?:Errora
promisify
函数的类型安全版本。看我的
Node.js样式的回调通常采用(value?:ValueType,err?:ErrorType)
的形式。当然,它们也可以具有内部变量形式,例如(a:a,b:b,…,n:n,err?:Error)
。覆盖第一个表单很容易。我发现,覆盖后者是困难的。为什么?
我发现类型推断不能很好地处理可选参数
parameters
err?:Error
arg。我正在调用数组的切片,该切片包含除尾部主体
之外的所有内容,并将其定义为:导出类型主体=T扩展[…推断B,推断_TailEl]?B:从来没有代码>
n?:n
和err?:Error
在推断中似乎没有被划分/考虑,因此我的条件类型查找失败,我运气不好
我的技巧是使用Required
包装参数
,这样我就可以成功地获取回调的主体,并将干净的回调签名很好地反射回返回值promisify(fn)(args)=>Promise
一个大的例外--WellTypedTupleArgsFromCallback
现在是一个元组,其中所有内容都有保证,因为Required
,这是一种不诚实的类型
这在附属的操场上很容易看到,并且有一些测试来显示什么是正确的/不正确的
如何正确地将可变回调主体映射为可选元素?幸运的是,我在假设中犯了一个错误。节点回调样式是(err,…value),而不是相反。使用节点回调样式已经很久了,我忘记了正确的签名;)
这种正确的arg布局强制在用户空间中将err键入为null/undefined/Error/unknown,并消除了对可选arg的歧视