일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 소켓
- 쉬운 문제
- ip
- 수학
- BFS
- 타입스크립트
- 타입 챌린지
- dp
- HTTP
- javascript
- 크롤링
- 자바스크립트
- Node.js
- 프로그래머스
- type challenge
- 문자열
- 그래프
- TCP
- HTTP 완벽 가이드
- Nestjs
- typescript
- 가천대
- Crawling
- socket
- dfs
- 레벨 1
- 프로그래머스 레벨 2
- Algorithm
- 알고리즘
- 백준
- Today
- Total
목록전체 글 (499)
kakasoo
type Shift = T extends [infer F, ...infer Rest] ? Rest : []; 타입 레벨에서 배열의 첫 요소를 제거하는 코드는 이렇게나 간단하다.
type IsPartitionSameEntire = T extends P ? P extends T ? true : false : false; type IsUnion = IsPartitionSameEntire extends true ? false : IsPartitionSameEntire extends false ? false : true; 조금 지저분한 풀이긴 하지만, 분산 법칙을 이용해서 푸는 방법이 있다. Equal 타입을 구현하다가 안 것인데, type Equal = X extends Y ? (Y extends X ? true : false) : false; type a5 = Equal; // boolean type a6 = Equal; // boolean Equal을 다음과 같이 X가 Y일 때 Y..
/** * 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}..
Math Types(1) - 타입으로 사칙연산하기 타입스크립트 언어는 자바스크립트와 타입 레벨을 합친 언어다. 따라서 타입을 지정하는 것 뿐만 아니라 직접 타입을 구현할 수 있는 수준이 되어야 타입스크립트 쓰는 것이다. 하지만 타입 레 kscodebase.tistory.com 타입에서 나누기와 나머지 연산 구현하기 export type Divide = NTuple extends [...NTuple, ...infer Rest] ? Divide : Answer; export type Remainder = Sub; 일단 이 두 식들을 이용하면 타입에서도 나누기와 나머..
왜 안 되는데요? Nestia는 NestJS로 작성된 백엔드 코드를 읽고 TypeScript compiler를 이용해서 프론트에서 사용 가능한 SDK를 만든다. 그래서 지금 사용하면 곤란한 TypeScript keyword들이 있는데, 하나는 typeof고 하나는 namespace이다. typeof의 경우 타입의 이름을 추론해낼 수 없게 되는 문제가 있다. namespace는 한 함수가 동일 네임스페이스로부터 두 개 이상의 내부 인터페이스, 타입을 가져올 때 문제가 될 수 있다. 이유는 import 시 두 타입이 하나의 인터페이스로부터 추론된다는 것을 컴파일러가 인지하기 어렵기 때문에 하나만 갖고 오게 되서다. https://kscodebase.tistory.com/663 모든 타입이 추론되는 API 만..
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 IsNever = [T] extends [never] ? true : false; Permutation, 타입으로 순열 구현하기 끔찍한 수준의 난이도인데 이게 왜 medium인지 모르겠다. 아래에 문제를 이해하기 위해 필요한 지식과 해석 순서를 모두 기재하였으니 참고하도록 하자. 문제, 그리고 필요로 하는 결과 type cases = kscodebase.tistory.com 여기에 자세한 설명이 쓰여 있다.
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가 올바른 해답이다.