[ts-challenges] Includes / Push / Unshift / Parameters
Includes
설계 의도
튜플 타입
T를 첫 번째 요소인Head와 나머지 요소들인Tail로 분리해서 추론한다.Head가 제네릭U타입과 동일하지 않으면Includes타입을Tail에 대해 재귀적으로 다시 실행하면서 다음 요소 검사하기boolean타입의 경우,true와false이 모두 할당가능하니까 엄격하게 동등한지 비교하기 위해서Equal헬퍼함수 사용
코드
type Equal<X, Y> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? true : false;
/* _____________ Your Code Here _____________ */
type Includes<T extends readonly any[], U> = T extends [infer Head,...infer Tail] ? Equal<Head,U> extends true ? true : Includes<Tail,U> : false
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>>,
]
Push
설계의도
- 기존 튜플 타입의 맨 마지막에 새로운 요소 추가하도록 처리
코드
/* _____________ Your Code Here _____________ */
type Push<T extends any[], U> = [...T, U]
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Push<[], 1>, [1]>>,
Expect<Equal<Push<[1, 2], '3'>, [1, 2, '3']>>,
Expect<Equal<Push<['1', 2, '3'], boolean>, ['1', 2, '3', boolean]>>,
]
Unshift
설계의도
- Push와 반대로 새로운 요소를 튜플의 앞에 추가하도록 처리
코드
/* _____________ Your Code Here _____________ */
type Unshift<T extends any[], U> = [U, ...T]
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Unshift<[], 1>, [1]>>,
Expect<Equal<Unshift<[1, 2], 0>, [0, 1, 2]>>,
Expect<Equal<Unshift<['1', 2, '3'], boolean>, [boolean, '1', 2, '3']>>,
]
Parameters
설계의도
제네릭
T타입이 함수 시그니처 형태인 경우, 조건부 타입 내부에서 매개변수의 타입을infer P를 사용해서P라는 제네릭 타입으로 추론해서 리턴하도록 처리infer은 여러 타입을 자동으로 하나의 튜플타입으로 정리해준다
코드
/* _____________ Your Code Here _____________ */
type MyParameters<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P : never;
/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '@type-challenges/utils'
function foo(arg1: string, arg2: number): void {}
function bar(arg1: boolean, arg2: { a: 'A' }): void {}
function baz(): void {}
type cases = [
Expect<Equal<MyParameters<typeof foo>, [string, number]>>,
Expect<Equal<MyParameters<typeof bar>, [boolean, { a: 'A' }]>>,
Expect<Equal<MyParameters<typeof baz>, []>>,
]