You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript动态设置函数参数可选性的问题与修正

动态设置函数参数可选性的问题与解决

需求与初始实现

需求是基于此前指定的泛型参数类型,动态设置当前函数的参数可选性,最初尝试通过参数组与元组来实现,代码如下:

interface Options<I> {
  init?: I,
  getInit?: () => I
}

function fun1 <P>(par: P) {
  function fun2 <I, O extends P extends boolean ? [options: Options<I>] : [options?: Options<I>]>(...arg: O) {
    return {
      p: '' as P,
      i: '' as I
    }
  }

  return fun2
}

存在的问题

实际调用时会出现两个异常:

  • 泛型I始终被推断为unknown
  • init的类型与getInit的返回值类型无法形成相互约束,推测是第一个问题引发的连锁反应

调用示例:

const { p, i } = fun1(true)({
  init: "1",
  getInit: () => "1"
})

实验性修正方案

通过调整泛型使用逻辑,引入泛型O捕获实际输入内容,修正后的代码可正确推断类型,目前暂不确定是否存在副作用,代码如下:

function fun1<P>(par: P) {
  function fun2<I, O extends Options<I>>(
    ...arg: P extends boolean
        ? [options: Options<I> & O]
        : [options?: Options<I> & O]
  ) {
    return {
      p: '' as P,
      i: '' as I,
      g: '' as unknown as O extends { getInit: () => any } ? true : false
    }
  }

  return fun2
}

const { p, i, g } = fun1(true)({
  init: "1",
  getInit: () => "1"
})
// p 类型为 boolean
// i 类型为 string
// g 类型为 true

内容的提问来源于stack exchange,提问作者beginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:00:07