TypeScript联合类型判断不直观:Has2类型返回never而非true问题咨询
TypeScript工具类型Has2返回never的原因及修复方案
你的Has2类型出现不符合预期的结果,核心原因是分布式条件类型的特性:
当T[number]是联合类型(此处UU[number]等价于'Kars' | 'Esidisi')时,TypeScript会将联合类型的每个成员单独代入条件判断,再合并结果:
'Kars' extends 'Kars'→ 返回true'Esidisi' extends 'Kars'→ 返回never
最终合并后的类型是true | never,而never在联合类型中会被自动忽略,因此AA的最终类型是never。
修复方案
有两种常见的解决方式:
方式1:避免分布式条件类型
将T[number]和U包裹在元组中,让整个联合类型作为一个整体进行判断:
type Has2<T extends readonly any[], U> = [T[number]] extends [U] ? true : never; type UU = ['Kars', 'Esidisi']; type AA = Has2<UU, 'Kars'>; // AA的类型为true
方式2:调换条件判断的顺序
如果你的需求是判断U是否是数组T中存在的元素类型,可以直接让U去extendsT[number]:
type Has2<T extends readonly any[], U> = U extends T[number] ? true : never; type UU = ['Kars', 'Esidisi']; type AA = Has2<UU, 'Kars'>; // AA的类型为true
这种写法中,'Kars'是'Kars' | 'Esidisi'的子类型,条件成立,直接返回true。
内容的提问来源于stack exchange,提问作者Season New
相关产品推荐
相关产品推荐

