# 949-AnyOf

# 题目描述

在类型系统中实现类似于 Python 中 any 函数。类型接收一个数组,如果数组中任一个元素为真,则返回 true,否则返回 false。如果数组为空,返回 false

例如:

type Sample1 = AnyOf<[1, '', false, [], {}]>; // expected to be true.
type Sample2 = AnyOf<[0, '', false, [], {}]>; // expected to be false.

# 分析

这个题目看起来只需要遍历一次元组,遇到 false 元素,就继续递归判断剩余元素,否则就返回 true,直到遍历结束,那么就返回 false。

所以问题就转换问,怎么判断一个元素为 false,从这道题目的 case 中推断,可以认为:

0 | false | '' | [] | undefined | null | {} 是 false。

可以通过定义一个 Zerolist 的类型,A extends Zerolist 就简单认为这个元素是 false。

但是这里面有个特殊类型 {},在前面提到过,函数,元组,对象,extends {} 都是 true。

那么就需要单独使用 Equal 进行判断即可。

# 题解

export type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
  T,
>() => T extends Y ? 1 : 2
  ? true
  : false;

type Zerolist = 0 | false | '' | [] | undefined | null;

type AnyOf<T extends readonly any[]> = T extends [infer F, ...infer R]
  ? F extends Zerolist
    ? AnyOf<R>
    : // 单独处理 {} 的判定
    Equal<F, {}> extends true
    ? AnyOf<R>
    : true
  : false;

# 知识点

  1. Equal
  2. [] | Function | { a: any } extends {} 为 true
Last Updated: 2023/5/16 06:00:28