TypeScript中如何让Lodash的extend函数支持无限参数类型?
Lodash extend 多参数类型问题修复方案
问题说明
使用Lodash的extend合并多个对象时,传入参数数量超过5个,返回值类型会变为unknown;但传入5个及以内参数时,类型推导正常。由于extend与扩展运算符行为存在差异(比如处理Proxy对象时效果不佳),因此不考虑用扩展运算符替代,需要解决extend支持无限参数的类型问题。
解决方案
方案1:自定义类型声明扩展Lodash类型
Lodash官方的extend类型只重载到了5个参数,我们可以通过自定义类型声明补充支持任意数量参数的情况:
创建一个类型声明文件(例如lodash-extend.d.ts),写入以下内容:
import type { Dictionary, NumericDictionary } from 'lodash'; declare module 'lodash' { interface LoDashStatic { extend<T extends object, U extends object[]>( target: T, ...sources: U ): T & U[number]; } }
这样extend就能支持任意数量的源对象,返回类型会自动推导为目标对象与所有源对象的交叉类型。
方案2:临时使用类型断言(不推荐大量使用)
如果只是临时场景,可直接为返回值添加类型断言:
const b = extend(foo1, foo2, foo3, foo4, foo5, foo6) as typeof foo1 & typeof foo2 & typeof foo3 & typeof foo4 & typeof foo5 & typeof foo6;
这种方式在参数较多时会比较繁琐,仅适合临时场景。
原因解析
Lodash默认的类型定义中,extend仅提供了最多包含5个源参数的重载声明。当传入参数超过这个数量时,TypeScript会匹配到最宽泛的兜底重载,导致返回类型变为unknown。通过补充支持可变参数的类型声明,就能让TypeScript正确推导任意数量参数下的返回类型。
内容的提问来源于stack exchange,提问作者Jon Sud
相关产品推荐
相关产品推荐

