일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 수학
- type challenge
- TCP
- HTTP 완벽 가이드
- typescript
- Crawling
- 소켓
- Algorithm
- 타입스크립트
- 타입 챌린지
- BFS
- 크롤링
- socket
- 프로그래머스 레벨 2
- 문자열
- 쉬운 문제
- 레벨 1
- 백준
- dfs
- dp
- 자바스크립트
- ip
- Node.js
- 가천대
- javascript
- 그래프
- 프로그래머스
- Nestjs
- 알고리즘
- HTTP
- Today
- Total
목록프로그래밍/TypeScript (65)
kakasoo
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..
https://github.com/type-challenges/type-challenges/blob/main/questions/00110-medium-capitalize/README.md 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 Answer type LetterM..
https://github.com/type-challenges/type-challenges/blob/main/questions/00010-medium-tuple-to-union/README.md type Arr = ['1', '2', '3'] type Test = TupleToUnion // expected to be '1' | '2' | '3' answer type TupleToUnion = any type TupleToUnion = T[number]; 답을 먼저 제시한다. 답을 추론해 나가는 과정도 아래 서술하겠지만, 사실 이런 서술을 무시하고도 Tuple을 Union으로 변환하는 게 저게 전부임을, 직관적으로 깨닫는 사람도 분명 있을 거라 생각한다. type TupleToUnion = T['leng..
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 Implement a generic MyReadonly2 which takes two type argument T and K. K specify the set of properties of T that should set ..
Type-Challenge의 문제 설계가 무척이나 잘 되어 있다고 느낀다. 그냥 타입스크립트를 평소에 쓰기만 했던 사람이 Type-Challenge의 문제들을 처음 푼다면 매우 답답할 것이다. 나는 분명 타입스크립트로 서비스를 개발하고 있는 개발자인데 Easy로 되어 있는 문제들도 풀기 어렵지 않은가 하고. 이는 타입스크립트를 사용한다는 말이 만들어낸 착각 같다. 타입스크립트 개발자란 어떻게 보면 그냥 파라미터와 리턴에 타입을 지정하거나 이미 만들어진 타입을 쓴다는 거고, 정확하게 구분한다면 남이 만든 타입을 쓰는 사람과 커스텀 타입을 구현할 수 있는 사람으로 나눠야 마땅할 것이다. 내가 직접 타입을 만드는 것, 어떻게 보면 라이브러리에 들어갈 타입을 구현해내는 것은 그저 쓰는 것과 전혀 다른 일이다. ..
interface Person { body: number; mind: boolean; soul: boolean; } type Zombie = MyOmit; // type Zombie = { body: number }; Person에서 mind | soul을 제외하면 body만 남는 걸 Zombie라고 정의할 수 있다고 해보자. MyOmit은 방금 한 말을 타입으로 정의하는 방법으로, TypeScript에서 Utility type으로 이미 정의된 Omit과 동일하다. Omit 타입을 구현하려면 아래처럼 사고를 확장해나가면 된다. type MyOmit = any; 가장 먼저 이 타입은 두 개의 타입 파라미터를 받는다고 정의할 수 있다. type MyOmit = any; K는 무조건 T라는 타입 안에 정의된 ..
type Includes = T extends [infer P, ...infer R] ? // T가 P와 나머지 R로 이루어진 배열이라면, 즉 length가 최소한 1 이상인 경우라면 Equal extends true ? true : Includes // U가 P랑 같다면 true, 아니라면 Includes를 재귀적으로 호출한다. : false Includes에서 재귀적으로 호출해야 한다는 사실을 알기 전까지는 머리카락이 다 빠질 것만 같았다. 왜냐하면 boolean이나 객체와 같은 경우에는 단순히 그 값을 U extends T[number] 형식으로 비교할 수 없기 때문이다. true는 boolean에 포함된다.
type First = T['length'] extends 0 ? never : T[0]; type A = First; // 3 type B = First 123, { a: string }]>; // () => 123 type C = First; // never 어떤 배열 T에 대해 T의 length가 0일 경우에는 어떠한 값도 없어야 하기 때문에 never, 그 외의 경우에는 T의 0번째 값을 반환한다. 타입 치고는 배열을 다루기 때문인지 무척이나 간단한 형태를 띄고 있다.
// Question : Exclude type을 정의하라 type question = any; TypeScript Utility type인 Exclude의 정의를 보면 T extends U ? never : T 라는 매우 생소한 표현이 등장한다. 아니, Exclude는 두번째 타입 파라미터로 받은 U를 제외한 나머지 타입을 반환하는데 왜 never 혹은 T 라는 타입이 되는가? 아래의 순서를 따라가면 그 의미를 이해할 수 있다. // Answer : 아래와 같은 논리를 따라가볼 수 있다. // 'a' | 'b' | 'c' 라는 타입에서 'a'를 exclude 한다고 가정한다. type answer1 = 'b' | 'c'; type answer2 = never | 'b' | 'c'; 주석과 같이 'a' ..
interface Person { name: string; age: number; } type Partial = { [P in keyof T]?: T[P]; // P will be each key of T } type PersonPartial = Partial; // same as { name?: string; age?: number; } in키워드는 키 조합의 모든 항목을 반복하는 구문의 일부로 사용된다. 위에서 Partial type은 key of T 이므로 name, age 프로퍼티들이 될 것이고, 그것이 반복된 키-밸류의 객체 타입을 의미한다. 다만 그 키의 값이 ?: 연산자로 optional 하다고 알려주기 때문에 이름의 의미와 같이, Partial하게 정의된다. type TupleToObjec..
function test(a:boolean) { return a ? 1 : 2; } const a = test(true); 이렇게 작성했을 경우 a의 타입은 1 | 2로 추론된다. function test(a: true): 1; function test(a: false): 2; function test(a: boolean): 1 | 2 { return a ? 1 : 2; } const a = test(true); 이렇게 작성하면 a의 타입은 1로 추론된다. 조건에 따른 a 타입을 추론하기 위해서는 단지 오버로딩을 이용하는 것만으로도 충분하다. 만약 분기 처리에 따라서, 또는 파라미터로 받은 a를 내부에서 호출하는 다른 메서드로 호출하는 등 추가적인 분기 처리가 생긴다면, 그만큼 더 많은 오버로딩을 작성함..
이 글에 나와 있는 Push Type은 이전 글에서 설명하고 있다. type NTuple = ? 타입 N 튜플은 타입 파라미터 N을 튜플의 크기로 하는 Tuple 타입을 의미한다. 두번째 파라미터로 받은 T는, 튜플에 포함되어 있어야 하는 값이 있는 경우, 값을 정의하기 위해 존재한다. 이 NTuple을 정의하려면 어떻게 해야 할까? type NTuple = ? 일단 N은 number를, T는 any[]를 확장해주어야 한다. T의 경우 기본 타입으로 빈 배열 ( 여기서는 튜플이라고 하는 게 정확하다 ) 을 받는다. 파라미터를 받았으니 이제 구현 부분이다. 구현을 위해서는 튜플 타입이 의미하는 게 무엇인지, 논리를 하나 씩 따져보는 것이 좋을 것이다. type NTuple = T['length'] exte..