dev-hamster

[type-challenges] medium 14-16 본문

타입스크립트/type-challenges

[type-challenges] medium 14-16

dev-hamster 2024. 10. 25. 01:03

Replace

문자열 S에서 From를 찾아 한 번만 To로 교체하는 Replace<S, From, To>를 구현하세요.

 

리터럴 타입을 이용해 조건부로 넘겼지만, From이 '' 케이스인 경우 통과하지 않는다.

type Replace<
  S extends string,
  From extends string,
  To extends string
> = S extends `${From}${infer T}`
  ? `${To}${T}`
  : S extends `${infer T}${From}${infer X}`
  ? `${T}${To}${X}`
  : S;

From이 공백 문자열인지 확인하는 분기를 추가하면 된다.

type Replace<
  S extends string,
  From extends string,
  To extends string
> = From extends ''
  ? S
  : S extends `${From}${infer T}`
  ? `${To}${T}`
  : S extends `${infer T}${From}${infer X}`
  ? `${T}${To}${X}`
  : S;

ReplaceAll

주어진 문자열 S에서 부분 문자열 From을 찾아 모두 To로 교체하는 제네릭 ReplaceAll<S, From, To>을 구현하세요.

 

Replace 코드에 재귀적으로 타입을 호출했는데, 이미 교체한 문자열에도 교체를 진행해 foobarfoobar 테스트 케이스를 통과하지 못한다.

type ReplaceAll<
  S extends string,
  From extends string,
  To extends string
> = From extends ''
  ? S
  : S extends `${infer T}${From}${infer X}`
  ? ReplaceAll<`${T}${To}${X}`, From, To>
  : S extends `${From}${infer T}`
  ? ReplaceAll<`${To}${T}`, From, To>
  : S;

 

리터럴 타입 내부에서 ReplaceAll 타입을 재귀적으로 호출하면 된다.

type ReplaceAll<S extends string, From extends string, To extends string> = From extends ''
  ? S
  : S extends `${infer R1}${From}${infer R2}`
  ? `${R1}${To}${ReplaceAll<R2, From, To>}`
  : S

Append Argument

함수 타입 Fn과 어떤 타입 A가 주어질 때 Fn의 인수와 A를 마지막 인수로 받는 Fn과 동일한 함수 유형인 G를 생성하세요.

 

Fn의 인자 타입을 추론하고 A를 추가하고자 아래처럼 작성했는데, 문법상에 오류가 있다.

type AppendArgument<Fn extends (...args: any[]) => unknown, A> = Fn extends (...X: any[]) => unknown ? (...X, A) => unknown : false;

 

arguments를 올바르게 타입을 추론하면 된다.

type AppendArgument<Fn, A> = Fn extends (...args: infer T) => infer U ? (...arg: [...T, A]) => U : never;

 

arguments 객체

arguments 객체는 함수에 전달된 인수에 해당하는 Array 형태의 객체이다.

function foo(a, b, c){
    console.log(arguments[0] === a);
    console.log(arguments[1] === b);
    console.log(arguments[2] === c);
}

 


타입 챌린지는 임시 중단합니다.

다양한 타입을 만드는건 재미있지만 자주 쓰이는 케이스로 타입스크립트를 학습하겠습니다~

 

'타입스크립트 > type-challenges' 카테고리의 다른 글

[type-challenges] medium 10-13  (0) 2024.10.22
[type-chllenges] medium 05-08  (2) 2024.10.22
[type-challenges] medium 01-04  (0) 2024.10.17
[type-challengs] easy 10-14  (0) 2024.10.12
[type-challenges] easy 06-09  (1) 2024.10.11