AnyOf
问题描述
在类型系统中实现类似于 Python 中 any 函数。类型接收一个数组,如果数组中任一个元素为真,则返回 true,否则返回 false。如果数组为空,返回 false。
例如:
type Sample1 = AnyOf<[1, '', false, [], {}]> // expected to be true.
type Sample2 = AnyOf<[0, '', false, [], {}]> // expected to be false.
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
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>>
]
// ============= Your Code Here =============
type isFalse = false | 0 | '' | [] | { [key: string]: never } | undefined | null
// 答案1
type AnyOf<T extends readonly any[]> = T extends [infer F, ...infer R]
? F extends isFalse
? AnyOf<R>
: true
: false
// 答案2
type AnyOf<T extends readonly any[]> = T extends isFalse[] ? false : true
type t1 = { name: 'test' } extends {} ? true : false // true
type t2 = { name: 'test' } extends {[key:string]:never} ? true : false // false
type t3 = {} extends {[key:string]:never} ? true : false // true
这道题的关键是枚举出所有的 false 类型,其中空对象很不好定义,{ [key: string]: never } ,由基本类型可知,never 为所有类型的子类型,所以能满足 {[key:string]:never}的只有{}, 其余判断很简单。