00949-medium-anyof

Back

type Falsy = 0 | '' | false | [] | { [K in any]: never } | undefined | null;

type AnyOf<T extends readonly any[]> = T[number] extends Falsy ? false : true;

Solution by DevShinnThant #34615

// 你的答案

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


Solution by Jayce-liang #34296

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

Solution by ouzexi #34027

Bit different than other solutions that I saw. It also covers the problematic case that a lot of the older solutions don't get: Expect<Equal<AnyOf<[0, '', false, [], {}, undefined, null]>, false>>,

type AnyOf<T extends readonly any[]> = T extends [infer First, ...infer Rest] 
  ? First extends 0 | '' | false | undefined | [] | {[key: string]: never} | null
    ? AnyOf<Rest> : true
  : false

Solution by netr #33938

// 你的答案
type IsFalsy<T> =
  T extends false | 0 | '' | [] | { [K in any]: never } | undefined | null
    ? true
    : false;

type IsTrue<T> = IsFalsy<T> extends true ? false : true;

type Tuple2Union<T> = T extends any[] ? T[number] : T;

type AnyOf<T extends readonly any[]> = IsTrue<Tuple2Union<T>> extends true ? true : false;

Solution by HelloGGG #33419

// 你的答案
type A = 0 | "" | false | [] | { [key: string]: never };

type AnyOf<T extends Array<any>> = T extends [infer F, ...infer S] ? (F extends A ? AnyOf<S> : true) : false;

Solution by 2531800823 #33243

麻烦的解法,难点在于怎么组合空数组和空对象,然后非空打上true标记,空打上false标记,提取标记的数组类型再比较

type CodValue = 0 | '' | undefined | null  | false;
type EmptyArray<T> = T extends any[] ? T['length'] extends 0 ? true : false : false;
type EmptyObject<T> = keyof T extends [never] ? true : false;
type Empty<T> = T extends any[] ? EmptyArray<T> : EmptyObject<T>;


type AnyOf<T extends readonly any[], A extends boolean[] = []> =  T extends [infer F, ...infer R] ?  
    Empty<F> extends true ? AnyOf<R, [...A, false]> :  F extends CodValue ? AnyOf<R, [...A, false]> : AnyOf<R, [...A, true]> : A['length'] extends 0 ? false : A extends Array<infer U> 
    ? boolean extends U ? true : U : never;

Solution by rootdavid #32613

// your answers
type AnyOf<T extends any[]> = T[number] extends 0  | '' | false | [] | { [key: string]: never } | undefined | null ? false: true

Solution by pea-sys #32520

type IsFalsy<V> = V extends 0 | '' | false | [] | Record<keyof any, never> | undefined | null ? true : false
type AnyOf<T extends readonly unknown[]> = 
  T extends [infer V, ...infer R] 
    ? IsFalsy<V> extends true
      ? AnyOf<R> 
      : true
    : false

더 간결한 풀이

type AnyOf<T extends any[]> = T[number] extends 0 | '' | false | [] | {[key: string]: never}
? false : true;

Solution by dev-hobin #32419

type AnyOf < T extends readonly any[]> = { [key in keyof T]: T[key] extends False ? false : keyof T[key] extends never ? false :true }

Solution by T-33 #32037

type AnyOf<T extends readonly any[]> = T extends [infer First, ...infer Rest]
  ? First extends 0 | '' | false | [] | {} | undefined | null
    ? AnyOf<Rest>
    : true
  : false;

Solution by jinyoung234 #31966


type AnyOf<T extends readonly unknown[]> = undefined extends UnionFromTuple<T>
	? false
	: null extends UnionFromTuple<T>
	? false
	: UnionFromTuple<T> extends never
	? false
	: true;

Solution by gasmg #31895

type AnyOf<T extends readonly any[]> = T extends [infer A, ...infer R] ? 
  [{}] extends [A] ?
    AnyOf<R> 
    : [A] extends [0 | '' | false | [] | null | undefined] ? 
        R extends [] ? 
          false : 
          AnyOf<R>
      : true
: false;

Solution by jay0815 #31762

// 你的答案
type AnyOf<T extends readonly any[]> = T extends [infer F, ...infer Rest]
                                      ? F extends 0 | '' | false | [] | {[key:string]:never} | undefined | null
                                        ? AnyOf<Rest>
                                        : true
                                      : false

Solution by kingshdu #31697

type AnyOf<T extends readonly any[]> = T extends [infer F, ...infer Rest] 
  ? Equal<F, {}> extends true ? AnyOf<Rest> : F extends Falsy ? AnyOf<Rest> : true  
  : false;

Solution by kai-phan #31660

// 你的答案
type AnyOf<T extends readonly any[]> =
T extends [infer F, ...infer R]
  ? F extends false
    ? AnyOf<R>
    : true
  : false 

但是并不能通过这条case

Expect<Equal<AnyOf<[0, '', false, [], {}, undefined, null]>, false>

这条case与描述不符,试了其他题解也无法通过……

seems this case is wrong

Solution by L0st1 #31613


type isTrue<T, K = keyof T> = 
    T extends Boolean
    ? T
    : [T] extends [never]
        ? false
        : T extends `${infer S}` 
            ? S extends '' 
                ? false 
                : true 
            : T extends number
                ? T extends 0
                    ? false
                    : true
                : T extends Array<infer U>
                    ? [U] extends [never]
                        ? false
                        : true
                    : T extends Object
                        ? [K] extends [never]
                            ? false
                            : true
    : false;

type AnyOf<T extends any[]> = 
    T extends [infer E, ...infer Rest]
        ? isTrue<E> extends true
            ? true
            : AnyOf<Rest>
    : false;

Solution by ricky-fn #31437

// your answers

// define falsy type
type Falsy = false | 0 | -0 | "" | null | [] | undefined | { [key: string]: never };

// destruct element and judge
type AnyOf<T extends readonly any[]> = T extends [infer F, ...infer R]
  ? F extends Falsy ? AnyOf<R> : true
  : false;

Solution by d1zzzzy #31243

// your answers
type AnyOf<T extends readonly any[]> = T[number] extends 0 | false | '' | undefined | null | [] | Record<string, never> ? false : true;

Solution by wzc520pyfm #31132

// 你的答案
type Falsy = 0 | '' | never | false | [] | Record<any, never> | null | undefined;
type AnyOf<T extends readonly any[]> = T extends Falsy[] ? false : true;

Solution by CDSP98 #31033

// https://github.com/type-challenges/type-challenges/blob/main/questions/00949-medium-anyof/README.md
type IsTrue<T> = T extends 0 | "" | false | [] | undefined
  ? false
  : T extends {}
  ? keyof T extends never
    ? false
    : true
  : true;

type AnyOf<T extends readonly unknown[]> = T extends [infer F, ...infer R]
  ? IsTrue<F> extends true
    ? true
    : AnyOf<R>
  : IsTrue<T[0]>;

Solution by flt3150sk #30885

This is my solution, although it's a bit rigid, at least it can work. Can someone guide me.

type AnyOf<T extends readonly any[]> = T extends [infer L, ...infer R]
  ? IsFalse<L> extends false
    ? AnyOf<R>
    : true
  : false

type IsFalse<F> = F extends false
  ? false
  : F extends 0
  ? false
  : F extends ''
  ? false
  : F extends []
  ? false
  : keyof F extends keyof {}
  ? false
  : F extends undefined
  ? false
  : F extends null
  ? false
  : true

/**
 * 0 => false
 * '' => false
 * false => false
 * [] => false
 * {} => false
 * undefined => false
 * null => false
 */

Solution by Chan-Yuxi #30596

// ============= 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 AnyOf<T extends readonly any[]> = T[number] extends | "" | 0 | false | null | undefined | [] | Record<string, never> ? false : true;

Solution by z-w-H #30470

type Falsy = false | 0 | '' | undefined | null | [] | Record<string, never>;

type AnyOf<T extends readonly any[]> = T extends [infer F, ...infer Rest] ? (F extends Falsy ? AnyOf<Rest> : true) : false;

Solution by kai-phan #30389

type FalsyArray = 0 | '' | false | [] | Record<string, never> | undefined | null; type AnyOf<T extends readonly any[]> = T extends FalsyArray[] ? false : true

Solution by Miodan #30327

type IsNotEmpty<T> = T extends undefined | null ? never 
                    : T extends 0 ? never 
                    : T extends [] ? never 
                    : T extends false ? never 
                    : T extends true ? true 
                    : T extends '' ? never 
                    : T extends object ? 
                        keyof T extends never ? never : true 
                    : true ; 

type AnyOf<T extends readonly any[]> = T[number] extends never ? false : IsNotEmpty<T[number]> extends never ? false : true;

Better:

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

Solution by qianzhong516 #29872

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

Solution by maximallain #29748

type FalsyValue = [] | '' | {[key: string]: never} | false | 0 | undefined | null
type IsFalsy<V> = V extends FalsyValue ? true : false
type AnyOf<T extends readonly any[]> = 
  T extends [infer A, ...infer Rest] 
  ? IsFalsy<A> extends true 
  ? AnyOf<Rest> 
  : true 
  : false 

Solution by MohammadArasteh #29511

type CheckEqual<T, U> = (

() => P extends T ? 1 : 2) extends (

() => P extends U ? 1 : 2) ? true : false type CheckTrue = U extends '' | 0 | false | null | undefined ? never : CheckEqual<{}, U> extends true ? never : CheckEqual<[], U> extends true ? never : true type AnyOf<T extends readonly any[]> = T['length'] extends 0 ? false : [CheckTrue<T[number]>] extends [never] ? false : true

// 你的答案

Solution by Yirujet #29508

type AnyOf<T extends readonly any[]> = T extends never[]
  ? false
  : {} | null | undefined extends T[number]
  ? false
  : true;

Solution by fauxparse #28810