泛型函数中条件类型的使用及包装函数实现咨询
泛型函数中条件类型的使用及包装函数实现咨询
看起来你已经用 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
相关产品推荐
相关产品推荐

