在类型系统里实现 JavaScript 的 Array.includes 方法,这个类型接受两个参数,返回的类型要么是 true 要么是 false
例如:
type isPillarMen = Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'> // expected to be `false`
我认为这不是一道简单题
type Includes<T extends readonly any[], U> = {
[K in T[number]]: true
}[U] extends true ? true : false
这样写要求了数组项必须是可以作为对象键的类型(string | symbol),因此它不会通过所有测试用例
type Includes<T extends readonly any[], U> = T extends [infer F, ...infer R]
? Equal<U, F> extends true
? true
: Includes<R, U>
: false
这样写是对的,但是要实现 Equal 类型:
type Equal<T, U> =
(<G>() => G extends T ? 1 : 2) extends
(<G>() => G extends U ? 1 : 2)
? true
: false