Skip to main content

898 - Includes

Answer TestCases

在类型系统里实现 JavaScript 的 Array.includes 方法,这个类型接受两个参数,返回的类型要么是 true 要么是 false

例如:

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

Solution

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

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

keyof T 返回由数组索引构成的联合类型,如 0 | 1 | 2 | ...

[I in keyof T] 遍历索引的联合类型, Equal 判断两个类型是否相同

{
[I in keyof T]: Equal<T[I], U>
}

最终结果是

{
0: true or false,
1: true or false
...
}

最后通过索引 [number] 获取是否是 truefalse 时,直接返回