00898-easy-includes

Back

// 你的答案
type Includes<T extends unknown[], K> = K extends keyof T[number] ? true : false;

Solution by SZGG2333 #33602

type Includes<P extends readonly any[], U> = true extends {
      [K in keyof P]: (<T>() => T extends U ? 1 : 2) extends <T>() => T extends P[K] ? 1 : 2 
        ? true 
        : false;
    }[number] 
  ? true : false;

Solution by Alex-Nicalace #33406

// 여기 풀이를 입력하세요
type Includes<T extends readonly any[], U> = T extends [infer F, ...infer Rest]
  ? Equal<F, U> extends true
    ? true
    : Includes<Rest, U>
  : false;

Solution by awesomelon #33368

type Includes<T extends readonly any[], U> = 
  T extends [infer R, ...infer S] 
    ? Equal<R, U> extends true
      ? true
      : Includes<S, U>
    : false

Solution by cognitiones #33342

type Includes<T extends readonly any[], U> = 
 T extends [infer K , ...infer Rest] ? 
  Equal<K,U> extends true ?
   true :
   Includes<Rest,U> 
  :false

Solution by daishi-motoyama #33341

type Includes<T extends any[], U> =  T extends [infer First, ...infer Rest]
  ? Equal<First, U> extends true ? true : Includes<Rest,U>
  : false;

// I couldn’t implement a correct comparison, so I resorted to this solution 😄 

Solution by mardukevich #33340

type Includes<T extends readonly any[], U> = {
  [P in T[number]]: true
}[U] extends true ? true : false

Solution by Skytim #33302

type isEqual<A, B> = (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false
type Includes<T extends readonly any[], U> = T extends [infer F, ...infer R]
  ? isEqual<U, F> extends true ? true : Includes<R, U> : false

Solution by HowCanLove #33261

type Includes<T extends readonly any[], U> = T extends readonly [ infer First, ...infer Other] ? Equal<First, U> extends true ? true : Includes<[...Other], U> : false

Solution by mosey-san #33119

type IsEqual<T, U> =
    (<G>() => G extends T ? 1 : 2) extends
    (<G>() => G extends U ? 1 : 2)
      ? true
      : false

type Includes<T extends readonly any[], U> = 
	T extends [infer First, ...infer Rest] 
		? IsEqual<First, U> extends true 
			? true 
			: Includes<Rest, U> 
		: false

Solution by KenjiGinjo #33088

type Includes<T extends readonly any[], U> = T extends [infer FIRST , ...infer REST] ? Equal<FIRST, U> extends true? true : Includes<REST, U> : false; ```

Solution by RanungPark #33048

// extends关键字
type Includes<T extends readonly any[], U> = U extends T[number] ? true : false;

Solution by CAN1177 #32847

type IsEqual<X, Y> = (<T>() => T extends X 
    ? 1 
    : 2
  ) extends <T>() => T extends Y 
    ? 1 
    : 2 
      ? true 
      : false;

type Includes<T extends readonly any[], U> = T extends [infer A, ...infer B]
  ? IsEqual<A, U> extends true
    ? true
    : Includes<B, U>
  : false;

Solution by Yasunori-aloha #32771

type MyIncludes<T, U> = U extends T[keyof T] ? true : false;

Solution by fuguxu #32631

type Includes<Value extends any[], Item> =
	IsEqual<Value[0], Item> extends true
		? true
		: Value extends [Value[0], ...infer rest]
			? Includes<rest, Item>
			: false;

Solution by wubrafiq807 #32545

type IsEqual<X, Y> =
	(<Z>() => Z extends X ? 1 : 2) extends
	(<Z>() => Z extends Y ? 1 : 2)
		? true
		: false;

type Includes<T extends readonly any[], U> = 
  T extends [infer First, ...infer Rest] 
    ? IsEqual<First, U> extends true 
      ? true 
      : Includes<Rest, U> 
    : false

IsEqual 이게 뭐람

정해지지 않은 임의의 타입(Z) 를 기반으로 할당 가능성을 체크하는 조건부 타입은 평가가 지연된다. 그리고 지연된 조건부 타입들간의 할당 가능성 체크는 타입스크립트 내부의 isTypeIdenticalTo 로직을 사용하는데 이 로직은

  1. 두 조건부 타입의 제약조건(X, Y)이 같다.
  2. 두 조건부 타입의 평가 결과에 각각 대응하는 타입(true -> 1, false -> 2)이 같다.

위의 두 가지 조건을 모두 만족해야 할당 가능하다고 판단한다.

여기서 제약 조건(X, Y)이 같아야 한다는 조건에 의해 IsEqual이 의도대로 작동하게 된다.

Solution by dev-hobin #32145

type Includes<T extends readonly any[], U> = T extends [infer F, ...infer R]
 ? (Equal<F, U>) extends true ? true : Includes<R, U>
 : false

It compares one by one. Firstly it infers the first element of the array T and compares with U, if is not equals then recursively compares with the rest of the array R, if the array is empty, then it returns false

Solution by joyanedel #32132

type IsEqual<T, U> =
	(<G>() => G extends T ? 1 : 2) extends
	(<G>() => G extends U ? 1 : 2)
		? true
		: false;

type Includes<
  T extends readonly any[], 
  U
> = T extends [infer PFirst, ...infer PRest]
  ? IsEqual<PFirst, U> extends true
    ? true
    : Includes<PRest, U>
  : false;

Solution by kino6052 #32034

// 你的答案
type TupleToObject<T extends any[]> = {
  [K in T[number]]: K;
};
type Includes<T extends any[], P> = P extends keyof TupleToObject<T> ? true : false;

Solution by ruofee #32001

// your answers
type Includes<T extends readonly any[], U> = Equal<U, T[0]> extends true
  ? T['length'] extends 0 ? false : true
  : T extends [T[0], ...infer Rest] ? Includes<Rest, U> : false

Solution by Rustamaha #31941

type Includes<T extends unknown[], U> = U extends T[number] ? true: false

Solution by Artemiks24 #31815

type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'> // expected to be `false`

type Includes<T extends string[], U> = U extends T[number] ? true : false

Solution by anovicenko74 #31721

// your answers
type Includes<T extends readonly any[], U> = 
  T extends [infer L, ...infer R]
    ? Equal<L, U> extends true ? true : Includes<R, U>
    : false

Solution by pea-sys #31695

type Includes<T extends readonly any[], U> = T extends [infer F, ...infer R] ? Equal<F, U> extends true ? true : Includes<R, U> : false;

Solution by kai-phan #31600

type Includes<T extends readonly any[], U> =
    T extends [infer A, ...infer B] // Check if T is a tuple with at least one element
    ? Equal<A, U> extends true // Check if the first element A is equal to U
        ? true // If the first element A is equal to U, return true
        : Includes<B, U> // If not equal, recursively check the rest of the tuple B
    : false; // If T is an empty tuple or not a tuple, return false

Solution by RAY-EZ #31483

// your answers
type Includes<T extends readonly any[], U> = U extends T[number] ? true : false

Solution by AhmedRagabKamal #31372

type Includes<T extends readonly any[], U> = 
 T extends [infer K , ...infer Rest] ? 
  Equal<K,U> extends true ?
   true :
   Includes<Rest,U> 
  :false

Solution by onishi-kohei #31352

// your answers
type IsEqual<T, U> =
	(<G>() => G extends T ? 1 : 2) extends
	(<G>() => G extends U ? 1 : 2)
		? true
		: false;

type Includes<T extends readonly any[], U> =  T extends [infer First, ...infer Rest] ? IsEqual<First, U> extends true ? true : Includes<Rest, U> : false;

Solution by yuisato1025 #31345

type Includes<T extends readonly any[], U> = T extends [
  infer Head,
  ...infer Tail
]
  ? Equal<Head, U> extends true
    ? true
    : Includes<Tail, U>
  : false;

Solution by vipulpathak113 #31341

type Includes<T extends readonly unknown[], U> = T extends [infer L , ...infer R] ?  Equal<L,U> extends true ? true: Includes<R,U> : false

Solution by Zhang-Lu-Bin #31310