在类型系统里实现 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