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

能否用简洁方式实现TypeScript双条件判断类型?

TypeScript多条件类型的简洁写法

在TypeScript中,无法直接用&&连接多个extends条件,但可以通过以下几种方式替代冗长的嵌套三元运算符:

1. 多参数条件:元组匹配

对于需要同时校验多个类型参数的场景,比如DoubleCheck<T, U>,可以将参数放在元组中一次性匹配,替代嵌套三元:

// 简洁写法
type DoubleCheck<T, U> = [T, U] extends [number, string] ? SomeType : never;

// 测试结果与原写法一致
DoubleCheck<0,"b"> // SomeType
DoubleCheck<"a"|0,"b"|1> // SomeType
DoubleCheck<"foo", 5> // never
DoubleCheck<undefined, "b"> // never

2. 单参数多条件:交叉类型约束

当单个类型需要满足多个子条件时,比如HasFooString<T>,可以将多个条件合并为交叉类型,直接在extends中判断:

// 简洁写法
type HasFooString<T> = T extends SomeType & { foo: string } ? TypeA : TypeB;

这里SomeType & { foo: string }要求T同时满足两个条件:是SomeType的子类型,且拥有string类型的foo属性,完全等价于原嵌套三元的逻辑。

3. 复杂场景:简化嵌套或辅助类型

对于依赖前置条件的复杂场景(比如TestAnchor<T>,第二个条件需要基于第一个条件的结果提取属性),可以通过合并重复分支或辅助类型简化:

简化嵌套写法(可读性优先)

type AnchorLike = 'a' | React.ComponentType<{ href: string }>;

type TestAnchor<T extends React.ElementType> = 
  T extends AnchorLike 
    ? React.ComponentProps<T> extends { href?: string } 
      ? 'anchor' 
      : 'not anchor'
    : 'not anchor';

辅助类型提取逻辑(复用优先)

如果需要复用条件判断逻辑,可以提取独立的辅助类型:

type AnchorLike = 'a' | React.ComponentType<{ href: string }>;
type HasOptionalHref<T extends React.ElementType> = React.ComponentProps<T> extends { href?: string } ? true : false;

type TestAnchor<T extends React.ElementType> = 
  T extends AnchorLike & (HasOptionalHref<T> extends true ? T : never)
    ? 'anchor'
    : 'not anchor';

内容的提问来源于stack exchange,提问作者Adam Thompson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:27:24