能否用简洁方式实现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
相关产品推荐
相关产品推荐

