일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그래프
- 크롤링
- 가천대
- 타입스크립트
- TCP
- HTTP 완벽 가이드
- 소켓
- 레벨 1
- BFS
- Algorithm
- 프로그래머스 레벨 2
- Nestjs
- Crawling
- 알고리즘
- typescript
- 프로그래머스
- socket
- 쉬운 문제
- 수학
- 문자열
- ip
- dp
- 타입 챌린지
- dfs
- HTTP
- 백준
- javascript
- Node.js
- 자바스크립트
- type challenge
- Today
- Total
목록typescript (15)
kakasoo
type FirstLetterCapitalize = Target extends `${infer F}${infer Rest}` ? `${Uppercase}${Rest}` : Target; 문자열의 첫 글자만을 대문자로 변경하는 타입이다.
type Add1 = Length; type Add2 = [...NTuple, ...NTuple] extends [...infer U] ? Length : never; 흥미롭게도 Add1은 템플릿 문자열 타입 내에서 사용할 수 없다. 즉, 이 `${Add1}` 타입으로 변경하여, 수를 문자로 바꾸는 활용이 불가능한데, 이는 Length 타입의 적용 시점 차이로 보인다. 아직까지는 정확한 이유는 모르겠으나 infer 키워드를 이용한 방식이 문자열 템플릿 타입 내에서 숫자를 사용할 때 더 강력한 것으로 보인다. https://stackoverflow.com/questions/76243178/generic-type-for-adding-two-numbers Generic type for adding two nu..
type Reverse = T extends [infer F, ...infer Rest] ? [...Reverse, F] : []; 뒤집히진 배열의 타입을 추론한다.
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..
타입스크립트 언어는 자바스크립트와 타입 레벨을 합친 언어다. 따라서 타입을 지정하는 것 뿐만 아니라 직접 타입을 구현할 수 있는 수준이 되어야 타입스크립트 쓰는 것이다. 하지만 타입 레벨에서는 언어에서 지원하는 사칙연산이 존재하지 않기 때문에 여기서부터 난이도가 급상승한다. 따라서 수학 공식에서 사용할 수 있는 타입들을 미리 구현하고 달달 외우면 반대로 난이도를 하락시킬 수 있다. 아래는 모두 내가 사용하고자 만든, 수학 법칙처럼 사용할 수 있는 유틸리티성 타입들이다. Length type Length = T['length']; type answer0 = Length; // 0 type answer1 = Length; // 1 type answer2 = Length; // 2 type answer3 = ..
이 글은 다음의 내용을 다룬다. 프론트 개발자들이 눈치채면 곤란한 백엔드 이야기 백엔드 개발자가 프로그래밍 언어가 Node.js 라서 얻을 수 있는 이점 Nestia 라이브러리를 이용한 Swagger 문서 및 SDK 생성 에러를 던지지 않고 값으로 다루는 방식 서버와 프론트가 분리되서 발생하는 문제들 첫째, 서버와 프론트의 중복 개발? 프론트 : 이거 API 호출하면 어떤 결과가 와요? 프론트 개발자가 질문을 한다. 이 질문에 대해서는 응답과, 각 요청 파라미터에 따른 에러 케이스들, 에러일 때 던지는 값들을 말해줘야 한다. 그러면 그 설명을 듣고 프론트 개발자는 그 응답에 맞는 타입 ( JS 라면 값 ) 을 정의해둘 것이다. 이는 Node.js 백엔드 개발자 입장에서는, 백엔드에서 이미 개발한 것들을 ..
type Flatten = T extends [infer R, ...infer Rest] ? R extends any[] ? [...Flatten, ...Flatten] : [R, ...Flatten] : []; 배열인지 아닌지에 따라 재귀적으로 풀 것인지 결정하면 된다. 만약 T가 infer R과 infer Rest로 구성된 배열일 때, R이 배열인지 아닌지에 따라 재귀적으로 접근하면 된다. Rest는 나머지 요소들이기 때문에 무조건 배열이며 따라서 재귀적으로 접근하면 된다. 만약 T가 이러한 배열이 아닐 경우에는 빈 배열이 된다.
type DeepReadonly = { readonly [K in keyof T]: T[K] extends ((...args:any[]) => any) ? T[K] : T[K] extends Record ? DeepReadonly: T[K] extends Array ? DeepReadonly : T[K]; } 타입을 재귀적으로 정의해야 한다는 것은 간단하지만, 그럼에도 빨간 줄이 사라지지 않아서 조금 헤맸다. 타입추론된 결과를 보니 함수도 객체라서 문제가 생긴 걸 파악할 수 있었고, 따라서 맨 앞에 extends를 하나 더 추가해 함수를 처리했다. 결과적으로 extends가 3개가 되었는데 이게 좋은 코드일까? type DeepReadonly = keyof T extends never ? T : { re..
GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge Collection of TypeScript type challenges with online judge - GitHub - type-challenges/type-challenges: Collection of TypeScript type challenges with online judge github.com type MyReturnType = T extends (...args:any[]) => infer R ? R : never; 어떤 타입 T를 정의할 때, 그 T에 대한 정의는 반드시 제너릭 쪽에 되어야 할 필요가 없다. 제..
[Feature request]type level equal operator · Issue #27024 · microsoft/TypeScript Search Terms Type System Equal Suggestion T1 == T2 Use Cases TypeScript type system is highly functional. Type level testing is required. However, we can not easily check type equivalence. I want a... github.com 글에서 Equals을 어떻게 설명하는지 나와있다. 다만, 완벽한 정의가 아니고, 대부분의 상황에 적합한 것이기 때문에 유틸리티 타입에 포함되지는 않는 것 같다. export type Equ..
type Chainable = { option(key: K, value: P): Chainable; get(): T; } const result1 = a .option('foo', 123) .option('bar', { value: 'Hello World' }) .option('name', 'type-challenges') .get() const result2 = a .option('name', 'another name' // @ts-expect-error .option('name', 'last name') .get() const result3 = a .option('name', 'another name') // @ts-expect-error .option('name', 123) .get() type E..
Type-Challenge의 문제 설계가 무척이나 잘 되어 있다고 느낀다. 그냥 타입스크립트를 평소에 쓰기만 했던 사람이 Type-Challenge의 문제들을 처음 푼다면 매우 답답할 것이다. 나는 분명 타입스크립트로 서비스를 개발하고 있는 개발자인데 Easy로 되어 있는 문제들도 풀기 어렵지 않은가 하고. 이는 타입스크립트를 사용한다는 말이 만들어낸 착각 같다. 타입스크립트 개발자란 어떻게 보면 그냥 파라미터와 리턴에 타입을 지정하거나 이미 만들어진 타입을 쓴다는 거고, 정확하게 구분한다면 남이 만든 타입을 쓰는 사람과 커스텀 타입을 구현할 수 있는 사람으로 나눠야 마땅할 것이다. 내가 직접 타입을 만드는 것, 어떻게 보면 라이브러리에 들어갈 타입을 구현해내는 것은 그저 쓰는 것과 전혀 다른 일이다. ..