题目描述
在类型系统中实现类似于 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 Falsy =
| Record<string, never>
| []
| 0
| ''
| false
| null
| undefined;
type AnyOf<T extends unknown[]> =
T[number] extends Falsy
? false
: true
类型约束
使用T extends unknown[]对T进行约束,确保T是一个数组类型
定义Falsy类型
Falsy是一个联合类型,包含所有被认为是假值的类型:
-
Record<string, never>:空对象类型,表示一个没有任何属性的对象 -
[]:空数组 -
0:数字0 -
'':空字符串 -
false:布尔值false -
null:null -
undefined:undefined
条件类型
type AnyOf<T extends unknown[]> =
T[number] extends Falsy
? false
: true
-
将数组转换为联合类型:
T[number]:将数组类型T转换为一个联合类型,包含数组中所有元素的类型
-
条件判断:
-
如果
T[number]的整体可以赋值给Falsy类型,说明数组T中的所有类型都是Falsy类型,则返回false -
否则,返回
true
-