일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스 레벨 2
- BFS
- HTTP 완벽 가이드
- 크롤링
- 백준
- Nestjs
- 프로그래머스
- 자바스크립트
- dp
- socket
- 타입 챌린지
- javascript
- 가천대
- 그래프
- 타입스크립트
- Node.js
- 쉬운 문제
- 수학
- Algorithm
- HTTP
- 레벨 1
- 문자열
- Crawling
- type challenge
- TCP
- ip
- typescript
- dfs
- 소켓
- 알고리즘
- Today
- Total
목록타입 챌린지 (20)
kakasoo
https://kscodebase.tistory.com/682 타입 레벨에서 문자열 Join 구현하기 type ToString= T extends string ? T : never; type ToStringTuple= T extends string[] ? T : never; type Join = T extends [infer F, ...infer Rest] ? `${ToString}${Join}` : ''; 문자열로 이루어진 배열을 받아 Join하는 타입을 구현했다. type kscodebase.tistory.com Join의 다른 구현 방법 type Join = Target extends [infer..
type IsTuple = [T] extends [never] ? // T가 never 라면 무조건 false여야 한다. false : T extends readonly any[] ? // T가 readonly any[] 라면, number extends T['length'] ? // T의 length가 숫자 상수인지 아닌지 검증하기 위해 number extends T['length']를 한다. false : // 만약 true라면 T['length']는 number인 것이기에 튜플이 아니다. true : // 만약 false라면 T['length']는 숫자 상수 타입이기 때문에 튜플이 맞다. false; // 애초에 T가 readonly any[]가 아니라면 튜플이 아니다. 주석으로 설명을 대체한다.
type ToString= T extends string ? T : never; type ToStringTuple= T extends string[] ? T : never; type Join = T extends [infer F, ...infer Rest] ? `${ToString}${Join}` : ''; type Replace = C extends '' ? never : S extends `${infer F}${infer Rest}` ? F extends C ? [...Replace] : [F, ...Replace] : []; type DropChar = Join DropChar는 문자열에서 특정한 글자가 있을 경우 삭제하는 타입을 구현한다. 사실, 이는 이전에 구현한 R..
type Reverse = T extends [infer F, ...infer Rest] ? [...Reverse, F] : []; 뒤집히진 배열의 타입을 추론한다.
type Shift = T extends [infer F, ...infer Rest] ? Rest : []; 타입 레벨에서 배열의 첫 요소를 제거하는 코드는 이렇게나 간단하다.
/** * wrong case */ // type StartsWith = `${U}${string}` extends `${T}` ? true : false; type StartsWith = T extends `${U}${string}` ? true : false; 처음에는 위에 주석처럼 풀고 동작하지 않는 것을 보았다. U에 string을 추가한 것만큼이 결국 T가 아닌가 생각했지만, 'ab'와 string을 조합한 것이 'abc'보다 크다는 걸 뒤늦게 깨달은 것이다. 그래서 extends 문에서의 비교 순서를 거꾸로 하여 T가 U에 string 타입을 더해 더 긴 문자열을 만든 것에 포함된다는 걸로 바꾸었다. type EndsWith = T extends `${string}..
type Absolute = `${T}` extends `-${infer R}` ? R : `${T}`; 수는 문자열이 아닌데 어떻게 마이너스를 제외한 숫자 부분만 추출하지 고민했지만, 그렇다면 문자로 바꿔주면 될 뿐이었다. 처음의 T를 `${T}`로 바꿔준다는 생각만 닿으면 이후는 너무나 간단하다.
type Case0 = ['', '', ''] type Case1 = ['+', '', ''] type Case2 = ['+', '1', ''] type Case3 = ['+', '100', ''] type Case4 = ['+', '100', '%'] type Case5 = ['', '100', '%'] type Case6 = ['-', '100', '%'] type Case7 = ['-', ..
type Falsy = 0 | '' | false | [] | null | undefined; type AnyOf = T extends [] ? false : // 빈 배열일 경우 무조건 false T extends [infer F, ...infer Rest] ? F extends Falsy ? // 맨 앞부터 검사했을 때 Falsy를 만날 경우 AnyOf : // 다음 타입을 검사한다 keyof F extends never ? // 현재 검사 중인 타입 F가 falsy가 아닐 때, 혹시 빈 객체는 아닌지 검사한다. AnyOf: true: never; 간단한 문제였지만 Falsy에 해당하는 값 중 빈 객체를 다루는 것으로 인해 곤혹스러웠다. 자바스크립트의 모든 값들은 객체이기 때문에, 따라서 모든 값의 ..
type A = { a: 3, b: never, c: 5 }; type Answer = A[keyof A]; // 'a' | 'b' keyof 키워드는 객체의 타입에서 프로퍼티 키 이름만을 뽑아내는데, 이 때 never는 keyof로 뽑히지 않는다. 이 점을 역이용하면 프로퍼티가 never인 것들만 이름을 뽑아내는 것을 만들 수 있다. type PickKeysIsNever = { [K in keyof T]: T[K] extends never ? K : never }[keyof T]; 이 타입은 never를 타입으로 가지는 키 네임들만을 뽑는 타입이다. type RemoveNever = Omit; 이제 원본 T로부터 never만을 Omit해버리면 된다. type Diff = RemoveNever Diff는..
type KebabCase = S extends '' ? '' : // S가 빈문자일 경우에는 빈문자를 리턴한다. S extends `${infer F}${infer S}` ? F extends Uppercase ? // 타입 F의 대문자 형태가 이미 F와 동일하다면, 알파벳이 아니거나 대문자 알파벳이다. Uppercase extends Lowercase ? // 만약 타입 F의 소문자와 대문자가 일치한다면 알파벳이 아니기에 `${F}${KebabCase}`: // F는 그대로, 뒷부분은 다시 케밥케이스를 재귀적으로 호출한다. IsFirstLetter extends true ? // 만약 기호가 아닐 경우에는, 문자열의 첫번째 글자인지 아닌지에 따라 `${Lowercase}${KebabCase}` : /..
// type Merge = { // [K in keyof (F & S)]: K extends keyof F ? F[K] : K extends keyof S ? S[K] : never; // } type Merge = { [K in keyof (F & S)]: K extends keyof S ? S[K] : K extends keyof F ? F[K] : never; } 두 객체를 합쳐야 하기 때문에 F & S 의 모든 key를 뽑고, 그 키가 어느 쪽인지에 따라 S, F에 인덱스로 주어지게 했다. 주석처리되어 있는 부분은 F에서 먼저 그 키를 찾는데, 이 문제는 키가 중복될 경우 나중에 들어온 S를 기준으로 하기 때문에 주석처리 되지 않은 쪽 Merge가 올바른 해답이다.