dev-hamster
[type-challenges] medium 14-16 본문
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 |