TypeScript中能否通过泛型修改类型?无需双函数实现类型匹配
解决方案
可以通过泛型默认值+条件类型实现单个函数的类型匹配需求,无需拆分两个函数。核心思路是利用条件类型根据泛型参数的不同返回对应类型,同时通过默认泛型参数处理未传入泛型的场景。
实现代码
function getResult<T extends never | HTMLElement = never>(): T extends never ? string : Array<T> { // 仅关注类型匹配,JavaScript实现可忽略(此处为占位) return null as any; }
类型验证示例
- 不传泛型参数时,返回类型为
string:const str = getResult(); // 类型:string - 传入
HTMLInputElement,返回类型为Array<HTMLInputElement>:const inputList = getResult<HTMLInputElement>(); // 类型:Array<HTMLInputElement> - 传入
HTMLSelectElement,返回类型为Array<HTMLSelectElement>:const selectList = getResult<HTMLSelectElement>(); // 类型:Array<HTMLSelectElement> - 传入
never,返回类型为string:const neverResult = getResult<never>(); // 类型:string
原理说明
- 泛型默认值:将
T的默认值设为never,确保调用时未指定泛型时,T自动取never - 条件类型:通过
T extends never ? string : Array<T>进行分支判断,精准返回对应类型,避免出现始终返回联合类型的问题 - 泛型约束:
T extends never | HTMLElement限制了泛型参数的合法范围,符合需求场景
内容的提问来源于stack exchange,提问作者nick zoum
相关产品推荐
相关产品推荐

