Skip to content

AnyOf

约 344 字大约 1 分钟

2022-12-01

题目

Github: AnyOf

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

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

解题思路

我们可以使用 T[number]T 中获取每个元素的类型,然后使用 extends 来判断每个元素是否不为真。

为方便比较,我们可以使用 Falsely 类型来表示不为真的元素。

答案

type Falsely = 0 | '' | false | undefined | null | [] | { [k: string]: never }
type AnyOf<T extends readonly any[]> = T[number] extends Falsely ? false : true

验证

type 
cases
= [
Expect
<
Equal
<
AnyOf
<[1, 'test', true, [1], {
name
: 'test' }, { 1: 'test' }]>, true>>,
Expect
<
Equal
<
AnyOf
<[1, '', false, [], {}]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, 'test', false, [], {}]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, '', true, [], {}]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, '', false, [1], {}]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, '', false, [], {
name
: 'test' }]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, '', false, [], { 1: 'test' }]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, '', false, [], {
name
: 'test' }, { 1: 'test' }]>, true>>,
Expect
<
Equal
<
AnyOf
<[0, '', false, [], {}, undefined, null]>, false>>,
Expect
<
Equal
<
AnyOf
<[]>, false>>,
]

参考