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

泛型函数中条件类型的使用及包装函数实现咨询

泛型函数中条件类型的使用及包装函数实现咨询

看起来你已经用 TypeScript 的条件类型搭好了针对 CustomA 和 CustomB 的输入校验逻辑,现在想给这个 someFn 写个包装函数对吧?我来帮你一步步梳理怎么实现~

首先先把你的原代码再明确出来,方便我们对照分析:

type CustomA = { type: 'customA' }
type CustomB = { type: 'customB' }

type Checker<T extends CustomA | CustomB> = T extends CustomA ? true : false

const someFn = <T extends CustomA | CustomB>(value: Checker<T> extends true ? T : 'error') => {
  return value
}

原逻辑里,Checker 这个条件类型会根据泛型 T 的具体类型返回 true 或 false,而 someFn 则通过条件类型做参数限制:只有当 T 是 CustomA 时(此时 Checker<T> 为 true),才能传入 T 类型的值;如果 T 是 CustomB,参数就只能传 'error',这个类型校验的设计挺巧妙的。

接下来是包装函数的实现,核心要保证完整保留原函数的泛型约束和类型校验逻辑,同时嵌入你需要的包装逻辑(比如日志打印、参数预处理、返回值加工等)。直接给你写个实用的示例:

// 包装函数实现
const wrappedSomeFn = <T extends CustomA | CustomB>(
  value: Checker<T> extends true ? T : 'error'
) => {
  // 这里可以加你需要的包装逻辑,比如打印调用日志
  console.log('包装函数被调用,传入参数:', value)
  
  // 调用原函数
  const originalResult = someFn(value)
  
  // 也可以对原函数的返回值做额外处理,比如给CustomA类型加个包装标识
  if (originalResult.type === 'customA') {
    return { ...originalResult, isWrapped: true } as typeof originalResult & { isWrapped: boolean }
  }
  
  return originalResult
}

这个包装函数和原函数用了完全一致的泛型约束和参数类型,所以原有的类型校验逻辑会被完整继承:

  • 当你传入 { type: 'customA' } 时,TypeScript 会自动推导 T 为 CustomA,参数完全合法
  • 如果你尝试传入 { type: 'customB' },TypeScript 会直接报错,提示你应该传入 'error' 类型

要是你不需要对返回值做处理,包装函数可以更简洁,直接调用原函数返回就行。另外如果包装函数需要接收额外参数,只要不破坏原有的泛型参数约束,也能轻松添加,比如:

const wrappedSomeFnWithExtra = <T extends CustomA | CustomB>(
  enableLog: boolean,
  value: Checker<T> extends true ? T : 'error'
) => {
  if (enableLog) {
    console.log('启用日志,当前参数:', value)
  }
  return someFn(value)
}

这样既保留了原有的类型校验能力,又能完美实现你需要的包装功能~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:44:34