일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- 알고리즘
- javascript
- 수학
- HTTP
- 타입 챌린지
- 백준
- type challenge
- 문자열
- socket
- 레벨 1
- 그래프
- Nestjs
- 자바스크립트
- Algorithm
- 프로그래머스 레벨 2
- TCP
- 크롤링
- 쉬운 문제
- 타입스크립트
- Node.js
- dfs
- HTTP 완벽 가이드
- BFS
- dp
- 가천대
- typescript
- 소켓
- ip
- Crawling
- Today
- Total
목록전체 글 (499)
kakasoo
타입스크립트 언어는 자바스크립트와 타입 레벨을 합친 언어다. 따라서 타입을 지정하는 것 뿐만 아니라 직접 타입을 구현할 수 있는 수준이 되어야 타입스크립트 쓰는 것이다. 하지만 타입 레벨에서는 언어에서 지원하는 사칙연산이 존재하지 않기 때문에 여기서부터 난이도가 급상승한다. 따라서 수학 공식에서 사용할 수 있는 타입들을 미리 구현하고 달달 외우면 반대로 난이도를 하락시킬 수 있다. 아래는 모두 내가 사용하고자 만든, 수학 법칙처럼 사용할 수 있는 유틸리티성 타입들이다. Length type Length = T['length']; type answer0 = Length; // 0 type answer1 = Length; // 1 type answer2 = Length; // 2 type answer3 = ..
"여기 가장 가까운 아이스크림 할인점이 어디에요?" 갑자기 누군가 물었다. 놀라서 돌아보니 초등학교 고학년으로 보이는 한 여자애였다. 여자애 뒤에는 동생으로 보이는 남자 애들 4명 정도가 편의점 아이스크림 통에 머리를 박고 있었다. 상상의 나래를 펴자면, 아마도 동생 모두 사주기엔 돈이 부족했던 거 아닐까? 질문하는 목소리에는 그 아이도 자신의 질문이 떨떠름했던 것은 아닐까 싶은, 떨리는 목소리였다. 나라면 이 아이처럼 질문을 할 수 있었을까? 어릴 때의 내 모습이 떠올랐다가 사라졌다. 짧은 시간이지만 나는 이 아이가 대견스러웠다. 문제 해결을 위해서, 전혀 모르는 사람에게 질문을 할 수 있다는 게 너무나도 멋져 보였다.
// 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를 뽑도록 수정했다.
이 글은 다음의 내용을 다룬다. 프론트 개발자들이 눈치채면 곤란한 백엔드 이야기 백엔드 개발자가 프로그래밍 언어가 Node.js 라서 얻을 수 있는 이점 Nestia 라이브러리를 이용한 Swagger 문서 및 SDK 생성 에러를 던지지 않고 값으로 다루는 방식 서버와 프론트가 분리되서 발생하는 문제들 첫째, 서버와 프론트의 중복 개발? 프론트 : 이거 API 호출하면 어떤 결과가 와요? 프론트 개발자가 질문을 한다. 이 질문에 대해서는 응답과, 각 요청 파라미터에 따른 에러 케이스들, 에러일 때 던지는 값들을 말해줘야 한다. 그러면 그 설명을 듣고 프론트 개발자는 그 응답에 맞는 타입 ( JS 라면 값 ) 을 정의해둘 것이다. 이는 Node.js 백엔드 개발자 입장에서는, 백엔드에서 이미 개발한 것들을 ..
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..
type MyCapitalize = S extends `${infer F}${infer Rest}` ? `${Uppercase}${Rest}` : S; 타입스크립트의 유틸리티 함수를 이용해서 풀었다. 아마 의도된 방법은 a-z까지를 A-Z로 매핑할 수 있는 타입, dictionary 같은 구조의 타입을 만들어 쓰는 거겠지만 귀찮았다.
type LookUp1 = U['type'] extends T ? U : never; type LookUp2 = U extends { type : T } ? U : never; 타입스크립트에서는 타입 가드를 정의하기 위해서 각 인터페이스에 type이라는 프로퍼티로 미리 이름을 지정하기도 한다. 이 type이라는 키의 값이 'dog'이면 Dog 인터페이스고 'cat'이면 Cat 인터페이스라는 식이다. 따라서 LookUp 로 정의되는 어떤 타입에 대하여 type 이 T인 경우를 찾아주는 함수를 만들 수 있다. 이름에서 보다시피 마치 엑셀의 VLookUp처럼 동작하는 것이다. 하지만 위의 코드는 제대로 동작하지 않고, 둘 중 아래의 LookUp2만이 올바르게 동작한다. 왜 그럴까? // LookUp1 에서는..
// type Replace = S extends `${infer R}${From}${infer T}` ? `${R}${To}${T}` : S type Replace = From extends '' ? S : S extends `${infer R}${From}${infer T}` ? `${R}${To}${T}` : S; 처음에 정의한 타입으로는 From이 빈 문자일 경우에 제대로 동작하지 않았다. 그래서 Replace에는 From이 빈 문자일 경우에는 그대로 S를 리턴하도록 하는 구문을 추가했다. 이 타입은 `${infer R}${From}${infer T}`로 구성된 타입에서 From을 To로 바꾸는 타입이다. 굳이 T를 붙인 이유는, 이 타입의 초기 문자열 S가 'foobarbar'와 같이 동일한 단..