Typescript: 고급 객체 타입

Lumpen·2024년 8월 12일
0

Typescript

목록 보기
22/23

고급 객체 타입

객체는 자바스크립트의 핵심으로 타입스크립트는 객체를 안전하게 표현하고
조작할 수 있는 다양한 수단을 제공한다

key in

API 통신 등을 할 때 깊이를 갖는 중첩된 객체에 대한 응답 타입을 일일히 작성하기 불편하다
이 때 타입스크립트의 key in 방식을 이용하면 좋다

type APIResponse = {
	count: number
  	friends: {
    	firstName: string
      	lastName: string
    }[]
}
type Friends = APIResponse['friends']

모든 형태와 배열에 키인 할 수 있다

keyof 연산자

객체의 모든 키를 문자열 리터럴 타입 유니온으로 얻을 수 있다

type ResponseKeys = keyof APIResponse // 'count' | 'friends'

키인과 keyof 를 혼합해 사용하면 객체에서 주어진 키에 해당하는 값을 반환하는 게터를 안전한 방식으로 구현할 수 있다

function get<O extends object, K extends keyof O> (o: O, k: K): O[K] {
	return o[k]
}
  1. 객체 o 와 키 k 를 인수로 받는다
  2. keyof O 는 문자 리터럴 타입의 유니온으로 o 의 모든 키를 표현한다
    K 는 유니온을 상속받는다 (유니온의 서브타입)
  3. O[K] 는 O 에서 K 를 찾을 때 얻는 타입이다

Record 타입

매핑하는 용도로 객체를 활용할 수 있다
Record 는 일반 객체의 인덱스 시그니처에 비해 자유롭다
일반 인덱스 시그니처에서 객체 값의 타입은 제한할 수 있지만
키는 반드시 일반 string, number, symbol 이어야 한다
Record 에서는 객체의 키 타입도 string 과 number 의 서브타입으로 제한할 수 있다

// Record
type Keys = 'aa' | 'bb'
type ScoreRecord = Record<Keys, number>;
let scores: ScoreRecord = { 'aa': 1, 'bb': 2 };

// Record 를 mapped type 으로 사용할 수도 있다
type Score = {
	[key in Keys]: number;
}

mapped type

Record 에 비해 더 안전하고 더 강력한 방법
매핑된 타입은 타입스크립트만의 고유한 기능이다
객체의 키와 타입을 매핑하는 수단을 제공한다
내장 Record 타입을 구현할 때 매핑된 타입을 이용한다

type Record<K extends keyof any, T> = {
	[P in K]: T
}

객체의 키와 값에 타입을 제공할 뿐 아니라
키인 타입과 조합하면 이름별로 매핑할 수 있는 값 타입을 제한할 수도 있다

내장된 매핑된 타입으로는
Record, Partial, Required 등이 있다

컴패니언 객체 패턴

스칼라에서 유래한 기능으로 같은 이름을 공유하는 객체와 클래스를 쌍으로 연결한다
타입스크립트에서 타입과 값은 별도의 네임스페이스를 갖는다

profile
떠돌이 생활을 하는. 실업자, 부랑 생활을 하는

0개의 댓글