// your answers
type Includes<T extends readonly any[], U> = T extends [infer F, ...infer Last] ? Equal<F, U> extends true ? true : Includes<Last, U> : false
Solution by AlexBraunMagic #36913
type Includes<T extends readonly any[], U> = {[P in T[number]]: true}[U] extends true ? true : false;
Solution by shaishabcoding #36847
type Includes<T extends readonly unknown[], I> = I extends T[number]
? true
: false;
Solution by atul60 #36830
type Includes<T extends any[], U> = boolean extends {
[key in keyof T]: Equal<T[key], U> extends true ? true : false ;
};
Solution by Abdullah-Elsayed01 #36806
解题思路: 重新映射数组中每一项索引的值,判断数组中是否存在 true
// 你的答案
type AnyTrue<T extends readonly boolean[]> =
true extends T[number] ? true : false;
type Includes<T extends readonly any[], U> = AnyTrue<{
[K in keyof T]: Equal<T[K], U>
}>
Solution by mietl #36804
type Equal1<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y
? 1
: 2
? true
: false;
type Includes<T extends readonly any[], U> = T extends [
infer First,
...infer Rest
]
? Equal1<First, U> extends true
? true
: Includes<Rest, U>
: false;
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Kars'>, true>>,
Expect<Equal<Includes<['Kars', 'Esidisi', 'Wamuu', 'Santana'], 'Dio'>, false>>,
Expect<Equal<Includes<[1, 2, 3, 5, 6, 7], 7>, true>>,
Expect<Equal<Includes<[1, 2, 3, 5, 6, 7], 4>, false>>,
Expect<Equal<Includes<[1, 2, 3], 2>, true>>,
Expect<Equal<Includes<[1, 2, 3], 1>, true>>,
Expect<Equal<Includes<[{}], { a: 'A' }>, false>>,
Expect<Equal<Includes<[boolean, 2, 3, 5, 6, 7], false>, false>>,
Expect<Equal<Includes<[true, 2, 3, 5, 6, 7], boolean>, false>>,
Expect<Equal<Includes<[false, 2, 3, 5, 6, 7], false>, true>>,
Expect<Equal<Includes<[{ a: 'A' }], { readonly a: 'A' }>, false>>,
Expect<Equal<Includes<[{ readonly a: 'A' }], { a: 'A' }>, false>>,
Expect<Equal<Includes<[1], 1 | 2>, false>>,
Expect<Equal<Includes<[1 | 2], 1>, false>>,
Expect<Equal<Includes<[null], undefined>, false>>,
Expect<Equal<Includes<[undefined], null>, false>>,
]
Solution by AnastasiaSv #36767
// your answers
type Includes<T extends readonly any[], U> = T extends [infer FirstValue,...infer RestValue] ? Equal<U,FirstValue> extends true ? true : Includes<RestValue,U> : Equal<U,T>
Solution by SubramaniyanTN #36674
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> =
Equal<T[0], U> extends true
? true
: T extends [infer first, ...infer rest]
? rest extends []
? false
: Includes<rest, U>
: false;
Solution by dheerajstvpm #36669
// 여기 풀이를 입력하세요
type Includes<T extends readonly any[], U> = T extends [infer Item, ...infer Rest]
? Equal<U, Item> extends true
? true
: Includes<Rest, U>
: false
Solution by seungdeok #36668
type IsEqual<T, U> =
(<G>() => G extends T ? 1 : 2) extends
(<G>() => G extends U ? 1 : 2)
? true
: false;
type Includes<Value extends any[], Item> =
Value['length'] extends 1
? IsEqual<Value[0], Item> extends true
? true
: false
: IsEqual<Value[0], Item> extends true
? true
: Value extends [Value[0], ...infer rest]
? Includes<rest, Item>
: false
Solution by wiJeeXu #36651
type Equal<X, Y> = (
type Includes<T extends readonly any[], U> = T extends [infer First, ...infer Rest] ? Equal<First, U> extends true ? true : Includes<Rest, U> : false
Solution by ChemieAi #36555
// your answers
type Includes<T extends readonly any[], U> =
T extends [infer A,...infer B] ? (Equal<U,A> extends true ? true : Includes<B, U>) : false
Solution by duanlvxin #36497
Just for posterity. Solves all.
type Includes<T extends readonly unknown[], U> = [] extends T
? false
: IsEqual<T[0], U> extends true
? true
: T extends [T[0], ...infer Rest]
? Includes<Rest, U>
: false;
type IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U
? 1
: 2
? true
: false;
Solution by JMPSequeira #36491
// 你的答案
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> = T extends readonly [
infer First,
...infer Rest
]
? Equal<First, U> extends true
? true
: Includes<Rest, U>
: false;
Solution by uuimorty #36465
// your answers
type Includes<T extends readonly any[], U> = T extends [infer First, ...infer Rest]
? Equal<First, U> extends true
? true
: Includes<Rest, U>
: false;
Solution by ATravelerGo #36434
type Includes<T extends readonly any[], U> = T extends [infer First, ...infer Rest]
? Equal<First, U> extends true
? true
: Includes<Rest, U>
: false;
Solution by alirezaprime #36416
// your answers
type AreEqual<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 []
?
false
:
T extends readonly [infer S, ...infer R]
?
AreEqual<S,U> extends true
?
true
:
Includes<R,U>
:
false
;
Solution by justBadProgrammer #36390
// 처음에 쓴 코드
// 밑 경우엔 A|B extends A true -> 서브타입임으로 참으로 판단되기 떄문
// type IsEqual<T,U> = T extends U ? U extends T ? true : false : false
type IsEqual<X, Y> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2)
? true
: false;
type Includes<T extends readonly any[], U> = T extends [infer First, ...infer Rest] ? IsEqual<First,U> extends true ? true : Includes<Rest,U> : false```
Solution by HelloWook #36366
type Includes<T extends readonly any[], U> =
T extends [infer First, ...infer Rest]
? Equal<First, U> extends true
? true
: Includes<Rest, U>
: false
Solution by asylbekduldiev #36289
// 你的答案
type Includes<T extends readonly any[], U> = T extends [infer P, ...infer Rets] ? (Equal<P, U> extends true ? true : Includes<Rets, U>): false
Solution by reonce #36049
type Includes<T extends readonly any[], U> = T extends [infer FirstEl, ...infer RestEl]
? Equal<FirstEl, U> extends true
? true
: Includes<RestEl, U>
: false;
Solution by karazyabko #36031
type Includes<T extends readonly any[], U> = T extends [infer First, ...infer Rest] ? Equal<First, U> extends true ? true : Includes<Rest, U> : false;
Solution by codingaring #35941
// 你的答案
// 方法1:将数组做映射,再将U作为key取出来,但它无法通过全部的测试用例
type Includes<T extends readonly any[], U> = {
[key in T[number]]: true
}[U] extends true ? true : false
// 方法2:递归调用isEqual方法
type isEqual<A,B> = (<K>() => K extends A ? 1: 0) extends (<K>() => K extends B ? 1: 0) ? true : false
// type res = isEqual<'a', 'a'>
// type res2 = isEqual<'a', 'b'>
// type res3 = isEqual<true, boolean>
// type res4 = isEqual<null, undefined> // false
// type res5 = isEqual<undefined, null> // false
type Includes<T extends readonly any[], U> = T extends [T[0], ...infer Rest] ? isEqual<T[0], U> extends true ? true : Includes<Rest, U> : false
Solution by naruto-823 #35794
type Includes<T extends string[], S> = S extends keyof T[number] ? true : false;
Solution by Sensuele #35778
// 你的答案
type Includes<T extends any[], U> = U extends T[number] ? true : false
Solution by ndwgg #35547
type Includes<T extends readonly any[], U> = { [P in keyof T ]: Equal<T[P], U> extends true ? true : false } extends { [key: number]: false } ? false : true;
Solution by gangnamssal #35491
export type FirstExpression<X> = <T>() => T extends X ? 1 : 2;
export type SecondExpression<Y> = <P>() => P extends Y ? 1 : 2;
export type MyEqual<X, Y> = FirstExpression<X> extends SecondExpression<Y> ? true : false;
type Includes<T extends readonly any[], U> = true extends {
[I in keyof T]: MyEqual<T[I], U>
}[number] ? true : false
Solution by RanungPark #35442
// your answers
type setup = ["Kars", "Esidisi", "Wamuu", "Santana"];
type Includes<T extends unknown[], U> = U extends T[number] ? true : false;
const firstData: Includes<setup, "Dio"> = false;
const trueData: Includes<setup, "Kars"> = true;
Solution by Sathiyapramod #35417
/**
Returns a boolean for whether given two types are equal.
@link https://github.com/microsoft/TypeScript/issues/27024#issuecomment-421529650
*/
type IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U
? 1
: 2
? true
: false;
type Includes<Value extends any[], Item> = Value extends [
infer First,
...infer Rest
]
? IsEqual<First, Item> extends true
? true
: Includes<Rest, Item>
: false;
Solution by gyeounjeong #35360
type MyEqual<X, Y> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? true : false
type Includes<T extends readonly any[], U> = T extends [] ? false :
MyEqual<T[0], U> extends true
? true
: T extends [infer f, ...infer rest]
? Includes<rest, U>
: false;
Solution by watanaki #35195