View on GitHub: https://tsch.js.org/28333
Remove the key starting with _
from given type T
.
주어진 타입 T
에서 _
로 시작하는 키를 제거
접근 방식
T
의 키를 순회하면서, _
로 시작하는 키를 제거코드
type PublicType<T extends object> = {
[K in keyof T as K extends `_${infer _}` ? never : K]: T[K];
};
코드 설명
K
로 T
의 키를 순회, 템플릿 리터럴 타입을 사용해 _
로 시작하는 키를 제거never
로 처리되어 빠짐View on GitHub: https://tsch.js.org/29650
Implement a type that extract prop value to the interface. The type takes the two arguments. The output should be an object with the prop values. Prop value is object.
예시
type Test = { id: "1"; myProp: { foo: "2" } };
type Result = ExtractToObject<Test, "myProp">; // expected to be { id: '1', foo: '2' }
T
에서 주어진 키 U
의 값을 추출하여 새로운 객체 타입을 반환접근 방식
코드
type MergedObject<T extends object> = {
[K in keyof T]: T[K];
};
type ExtractToObject<T, U extends keyof T> = U extends keyof T
? MergedObject<{ [K in keyof T as K extends U ? never : K]: T[K] } & T[U]>
: T;
코드 설명
MergedObject<T>
: 주어진 객체 T
의 모든 키와 값을 포함하는 새로운 객체 타입을 생성K
는 T
의 키 값을 순회, 만약 해당 키 값이 U
에 extends
되지 않는 경우만 남긴 객체 생성T[U]
를 합치기View on GitHub: https://tsch.js.org/29785
Implement a typeDeepOmit
, Like Utility types Omit, A type takes two arguments.
예시
type obj = {
person: {
name: string;
age: {
value: number;
};
};
};
type test1 = DeepOmit<obj, "person">; // {}
type test2 = DeepOmit<obj, "person.name">; // { person: { age: { value: number } } }
type test3 = DeepOmit<obj, "name">; // { person: { name: string; age: { value: number } } }
type test4 = DeepOmit<obj, "person.age.value">; // { person: { name: string; age: {} } }
접근 방식
S
를 받으면, .
을 기준으로 나눠서 하나씩 재귀처리.
이 없으면, 해당 키를 리턴 (반대로 생각함...)코드
type DeepOmit<T, S> = S extends `${infer First}.${infer Rest}`
? First extends keyof T
? Record<First, DeepOmit<T[First], Rest>>
: never
: S extends keyof T
? T[S]
: never;
실패 이유
접근 방식
코드
type DeepOmit<T, S> = S extends `${infer First}.${infer Rest}`
? First extends keyof T
? {
[K in keyof T]: K extends First ? DeepOmit<T[K], Rest> : T[K];
}
: T
: S extends keyof T
? Omit<T, S>
: T;
코드 설명
S
를 받으면, .
을 기준으로 나눔(First, Rest)DeepOmit<T[K], Rest>
을 재귀적으로 호출S
가 .
가 없을 경우(마지막 프로퍼티인 경우), Omit<T, S>
처리View on GitHub: https://tsch.js.org/30301
return true is a number is odd
접근 방식
코드
type LastChar<S extends string> = S extends `${infer _}${infer R}`
? R extends ""
? S
: LastChar<R>
: never;
type IsOdd<T extends number> = `${T}` extends
| `${string}.${string}`
| `${string}e${string}`
? false
: LastChar<`${T}`> extends "1" | "3" | "5" | "7" | "9"
? true
: false;
코드 설명
LastChar<S>
는 문자열의 마지막 문자를 반환하는 타입${T}
가 .${string}
또는 e${string}
인 경우, false를 반환${T}
의 마지막 문자가 1
| 3
| 5
| 7
| 9
인 경우, true를 반환3e0
의 경우, ${3e0}
는 3
으로 인식, 3e23
의 경우, ${3e23}
는 {string}e${string}
으로 인식View on GitHub: https://tsch.js.org/30430
Simulate the solution for the Tower of Hanoi puzzle. Your type should take the number of rings as input an return an array of steps to move the rings from tower A to tower B using tower C as additional. Each entry in the array should be a pair of strings [From, To]
which denotes ring being moved From -> To
.
코드
type Hanoi<
N extends number,
From = "A",
To = "B",
Intermediate = "C",
CurrentIndex extends unknown[] = []
> = CurrentIndex["length"] extends N
? []
: [
...Hanoi<N, From, Intermediate, To, [...CurrentIndex, unknown]>,
[From, To],
...Hanoi<N, Intermediate, To, From, [...CurrentIndex, unknown]>
];
코드 설명
View on GitHub: https://tsch.js.org/30958
Given a number N, construct the Pascal's triangle with N rows.
코드
type GetLast<T extends number[][]> = T extends [
...any,
infer L extends number[]
]
? L
: never;
type ToTuple<T extends number, R extends number[] = []> = R["length"] extends T
? R
: ToTuple<T, [...R, 0]>;
type Sum<T extends number, U extends number> = [
...ToTuple<T>,
...ToTuple<U>
]["length"];
type GenRow<T extends number[], R extends number[] = [1]> = T extends [
infer F extends number,
infer S extends number,
...infer L extends number[]
]
? [Sum<F, S>] extends [infer A extends number]
? GenRow<[S, ...L], [...R, A]>
: never
: [...R, 1];
type Pascal<
N extends number,
R extends number[][] = [[1]]
> = R["length"] extends N ? R : Pascal<N, [...R, GenRow<GetLast<R>>]>;
코드 설명
R
)을 반환GenRow
함수를 통해 파스칼의 삼각형을 만들어 배열에 추가GenRow
함수는 파스칼의 삼각형의 마지막 행을 가져오고, 이를 더해 새로운 행을 만듦