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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:29:56