[TypeScript] Type Challenges #949 - AnyOf

81 阅读1分钟

题目描述

在类型系统中实现类似于 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

  • nullnull

  • undefinedundefined

条件类型

type AnyOf<T extends unknown[]> = 
    T[number] extends Falsy 
		? false 
		: true
  • 将数组转换为联合类型:

    • T[number]:将数组类型T转换为一个联合类型,包含数组中所有元素的类型
  • 条件判断:

    • 如果T[number]的整体可以赋值给Falsy类型,说明数组T中的所有类型都是Falsy类型,则返回false

    • 否则,返回true