일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그래프
- 프로그래머스
- 백준
- 레벨 1
- dfs
- socket
- 수학
- TCP
- Nestjs
- 소켓
- HTTP
- type challenge
- 크롤링
- dp
- 자바스크립트
- 알고리즘
- 쉬운 문제
- BFS
- 타입스크립트
- 타입 챌린지
- Algorithm
- ip
- HTTP 완벽 가이드
- Node.js
- 프로그래머스 레벨 2
- 가천대
- javascript
- typescript
- Crawling
- 문자열
- Today
- Total
목록프로그래밍/TypeScript (65)
kakasoo
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가 올바른 해답이다.
타입스크립트 언어는 자바스크립트와 타입 레벨을 합친 언어다. 따라서 타입을 지정하는 것 뿐만 아니라 직접 타입을 구현할 수 있는 수준이 되어야 타입스크립트 쓰는 것이다. 하지만 타입 레벨에서는 언어에서 지원하는 사칙연산이 존재하지 않기 때문에 여기서부터 난이도가 급상승한다. 따라서 수학 공식에서 사용할 수 있는 타입들을 미리 구현하고 달달 외우면 반대로 난이도를 하락시킬 수 있다. 아래는 모두 내가 사용하고자 만든, 수학 법칙처럼 사용할 수 있는 유틸리티성 타입들이다. Length type Length = T['length']; type answer0 = Length; // 0 type answer1 = Length; // 1 type answer2 = Length; // 2 type answer3 = ..
// type StringToUnion = T extends `${infer F}${infer S}` ? (F | StringToUnion) : T; type StringToUnion = T extends '' ? never : T extends `${infer F}${infer S}` ? (F | StringToUnion) : T; T가 만약 infer F와 S로 이루어진 문자열이라면 F와 나머지 문자에 대해서 StringToUnion을 재귀적으로 푼 결과를 유니온으로 받는다. 만약 그러한 문자열이 아니면 T를 받는다. 단, 문자열 T가 빈 문자열인 경우에는 해당 식은 성립하지 않기 때문에 T ( = '' ) 를 리턴하는 문제가 있다. 따라서 빈 문자를 유니온 조합에서 제거하기 위해 맨 앞에 T ext..
타입 챌린지의 문제인데, 미디움에 있었다. 끔찍한 수준의 난이도인데 이게 왜 medium인지 모르겠다. 아래에 문제를 이해하기 위해 필요한 지식과 해석 순서를 모두 기재하였으니 참고하도록 하자. 문제, 그리고 필요로 하는 결과 type cases = [ Expect, Expect, Expect, Expect, Expect, ] 분산적 조건 타입 type Singular = T extends never ? true : false; type IfAnySingular = Singular; // boolean 타입스크립트 핸드북 - 분산적 조건 타입 Documentation - Conditional Types Create types which act like if statements in the type sys..
type Split = T extends `${infer R}${infer Rest}` ? [R, ...Split] : []; type LengthOfString = Split['length']; 문자열에서의 length는 타입을 뽑아도 number로 나올 뿐, readonly 상태의 어떤 상수 값이 나오질 않는다. 따라서 배열로 변경할 필요가 있어서 일단 Split 이라는 타입을 만들고 거기서 length를 뽑도록 수정했다.
type AppendArgument any), A> = (rest:[...Parameters, A]) => ReturnType; type AppendArgument any), A> = (...rest:[...Parameters, A]) => ReturnType; 처음에는 위처럼 작성했다. 하지만 구현된 결과물을 보니 rest는 배열 형태를 타입으로 가지고 있었다. 즉, 배열을 받는 배열이지, a,b,x... 형태의 파라미터들을 각각 받는 함수가 아니었다. 그래서 전개 연산을 추가했다. a,b,x 라는 식별자 이름으로 인해서 이걸 어떻게 객체 형태로 풀어 쓰느냐 고민했지만, 생각해보니 이건 함수라서 식별자 이름은 아무래도 상관없었다. 전개 연산을 추가하니 쉽게 해결되었다.
type ReplaceAll = S extends From ? To : ( S extends `${From}${infer Rest}` ? `${To}${ReplaceAll}` : (S extends `${infer First}${From}${infer Last}` ? `${First}${To}${ReplaceAll}`: (S extends `${infer First}${From}` ? `${First}${To}` : S))); 좀 복잡해보이지만 이렇게 정의할 수 있다. S가 나올 수 있는 경우는 이미 From인 경우, 뒤에 다른 문자열 포함한 From인 경우, 앞과 뒤에 다른 문자열을 포함한 From인 경우, 그리고 앞에만 다른 문자열을 포함한 From인 경우, From이 포함되지 않은 경우, 이렇게 5..