Disclosure

Most of the problems under my TypeHero Challenges folder were either obtained from typehero.dev or from type-challenges repo. Purpose of these articles are just to document my approaches for my easy reference. Please visit the respective links for more info.

Link to original

Problem Description

Implement the JavaScript Array.includes function in the type system. A type takes the two arguments. The output should be a boolean true or false.

For example:

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

Solutions

Approach: Using custom type equality check

type MyEqual<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 First, ...infer Rest]
	? MyEqual<First, U> extends true
		? true
		: Includes<Rest, U>
	: false;