如何在映射的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:从来没有
  • 但是<当元组类型中有可选项时,code>Body不起作用。问题是参数中的arg
    n?:n
    err?:Error
    推断中似乎没有被划分/考虑,因此我的条件类型查找失败,我运气不好

    我的技巧是使用
    Required
    包装
    参数
    ,这样我就可以成功地获取回调的主体,并将干净的回调签名很好地反射回返回值
    promisify(fn)(args)=>Promise

    一个大的例外--
    WellTypedTupleArgsFromCallback
    现在是一个元组,其中所有内容都有保证,因为
    Required
    ,这是一种不诚实的类型

    这在附属的操场上很容易看到,并且有一些测试来显示什么是正确的/不正确的


    如何正确地将可变回调主体映射为可选元素?

    幸运的是,我在假设中犯了一个错误。节点回调样式是(err,…value),而不是相反。使用节点回调样式已经很久了,我忘记了正确的签名;)

    这种正确的arg布局强制在用户空间中将err键入为null/undefined/Error/unknown,并消除了对可选arg的歧视