898 - Includes
在类型系统里实现 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]
获取是否是 true
或 false
时,直接返回