[Typescsript] 타입스크립트 올인원:Part-1(2)

4. 튜플 사용 시 주의사항

let tuple: [string, number] = ["1", 1];
// tuple[2] = 3;  // error
tuple.push(3);

❗️길이가 2로 고정된 것처럼 보이지만 정의된 길이(2)를 벗어난 인덱스 접근은 에러를 반환하지만, 배열 메서드인 push는 허용되는 한계가 있다.

💡 대처법

// 1. readonly 튜플 사용
const readonlyTuple: readonly [string, number] = ["1", 1];
readonlyTuple.push(3); // error

// 2. as const 사용
const constTuple = ["1", 1] as const;
constTuple.push(3); // error

// 3. 커스텀 타입 생성
type StrictTuple<T extends any[]> = {
  readonly length: T['length'];
  readonly [K in keyof T]: T[K];
};

5. Enum

const enum EDirection {
  Up = 3,
  Down = 4,
  Left = 5,
  Right = 6,
}

const ODirection = {
  Up: 3,
  Down: 4,
  Left: 5,
  Right: 6,
} as const;
type ODirection = (typeof ODirection)[keyof typeof ODirection];

const a = EDirection.Left; // 4
const b = ODirection.Left; // 5

 

type ODirection = (typeof ODircetion)[keyof typeof ODircetion]; 부분 이해가 잘 안되서 추가로 적겠습니다.

type ODirection = (typeof ODircetion)[keyof typeof ODircetion];

typeof ODircetion은 다음과 같은 타입을 반환
{
  readonly UP: 1;
  readonly DOWN: 2;
  readonly LEFT: 3;
  readonly RIGHT: 4;
}

keyof typeof ODircetion은 다음을 반환
"UP" | "DOWN" | "LEFT" | "RIGHT"

 

⚠️ Enum은 변수들을 하나의 그룹으로 묶고 싶을 때 자주 사용하지만 Tree-shaking 관점에서 사용하지 않고 Union Types을 권장하는 글도 있다. (하단 링크 참조)
 

TypeScript enum을 사용하지 않는 게 좋은 이유를 Tree-shaking 관점에서 소개합니다.

들어가며 안녕하세요. LINE Growth Technology UIT 팀의 Keishima(@pittanko_pta)입니다. 이번 글에서는 TypeScript의 enum을 사용하지 않는 편이 좋은 이유를 Tree-shaking 관점에서 소개하겠습니...

engineering.linecorp.com

 

6. keyof, typeof

// 1. as const로 객체 선언
const obj = { a: "123", b: "hello", c: "world" } as const;

// 2. 객체의 키들의 유니온 타입 얻기
type Keys = keyof typeof obj;  // "a" | "b" | "c"

// 3. 객체의 값들의 유니온 타입 얻기
type Values = typeof obj[keyof typeof obj];  // "123" | "hello" | "world"

 

6-1. keyof

객체 타입의 키들을 유니온 타입으로 추출

type Keys = keyof typeof obj;  // "a" | "b" | "c"

 

6-2. typeof

값의 타입을 얻음

type ObjType = typeof obj;  
// { readonly a: "123", readonly b: "hello", readonly c: "world" }

 

6-3. typeof obj[keyof typeof obj]

// keyof typeof obj는 "a" | "b" | "c"
// obj["a" | "b" | "c"]는 모든 가능한 값을 유니온으로 만듦
type Values = typeof obj[keyof typeof obj];  // "123" | "hello" | "world"

 

7. union, intersection

union: 하나만 있어도 된다.

type B = { hello: "world" } | { zero: "cho" };
const b: B = { hello: "world", zero: "cho" };

 

intersection: 모든 속성이 다 있어야 한다.

type A = { hello: "world" } & { zero: "cho" };
const a: A = { hello: "world", zero: "cho" };