본문 바로가기
프로그래밍/TypeScript

타입 조작하기

by hi-rachel 2023. 10. 24.

타입 조작하기

인덱스트 엑세스 타입

/**
 * 인덱스드 엑세스 타입
 * 인덱스를 이용해 다른 타입내의 특정 프로퍼티 타입을 추출하는 타입
 * 객체, 배열, 튜플에 사용 가능
 */

type PostList = {
  title: string;
  content: string;
  author: {
    id: number;
    name: string;
    age: number;
    location: string;
  };
}[];

// 아래와 같은 코드로 Post[key] 대체하면 오류, Post["author"]에는 오로지 타입만 명시할 수 있다.
// const key = "author";

// Post["author"]["id"] 중첩으로 대괄호도 쓸 수 있다

// 인덱스드 엑세스 타입을 이용할 때 대괄호 안에 number 타입을 넣어주면 배열 타입으로부터 하나의 요소의 타입만 가져올 수 있다.
// PostList[number] = PostList[0]

function printAuthorInfo(author: PostList[number]["author"]) {
  console.log(`${author.name} - ${author.id}`);
}

const post: PostList[number] = {
  title: "게시글 제목",
  content: "게시글 본문",
  author: {
    id: 1,
    name: "이정환",
    age: 27,
    location: "South Korea",
  },
};

printAuthorInfo(post.author);

// 튜플과 함께 사용하는 법
// 튜플 -> 길이 고정, 존재하지 않는 인덱스 접근시 오류
type Tup = [number, string, boolean];

type Tup0 = Tup[0];

type Tup1 = Tup[1];

type Tup2 = Tup[2];

// [number]를 명시해주면 해당 tuple에 존재하는 타입의 최적의 타입(유니온 타입)을 추출한다.
type TupNum = Tup[number];

keyof 연산자

/**
 * keyof 연산자
 * 객체 타입으로부터 프로퍼티의 모든 key들을 String Literal Union 타입으로 추출하는 연산자
 */

// 아래 typeof 코드로 대체 가능
// interface Person {
//   name: string;
//   age: number;
// }

type Person = typeof person;

function getPropertyKey(person: Person, key: keyof typeof person) {
  return person[key];
}

const person = {
  name: "이정환",
  age: 27,
};

getPropertyKey(person, "name"); // 이정환

맵드 타입

/**
 * 맵드 타입
 */

interface User {
  id: number;
  name: string;
  age: number;
}

type PartialUser = {
  [key in "id" | "name" | "age"]?: User[key];
};

type BooleanUser = {
  [key in keyof User]: boolean;
};

type ReadonlyUser = {
  readonly [key in keyof User]: User[key];
};

// 한 명의 유저 정보를 불러오는 기능
function fetchUser(): User {
  // ... 기능
  return {
    id: 1,
    name: "Rachel",
    age: 25,
  };
}

// 한 명의 유저 정보를 수정하는 기능
function updateUser(user: PartialUser) {
  // ... 수정하는 기능
}

updateUser({
  id: 1,
  name: "Rachel",
  age: 24,
});

템플릿 리터럴 타입

/**
 * 템플릿 리터럴 타입
 */

type Color = "red" | "black" | "green";

type Animal = "dog" | "cat" | "chicken";

type ColoredAnimal = `${Color}-${Animal}`;

const coloredAnimal: ColoredAnimal = "red-cat";

[참고]

한 입 크기로 잘라먹는 타입스크립트

  • Section 8. 타입 조작하기 강의를 듣고 정리한 내용입니다.

'프로그래밍 > TypeScript' 카테고리의 다른 글

유틸리티 타입  (1) 2023.10.26
조건부 타입  (1) 2023.10.24
타입스크립트 제네릭  (0) 2023.10.23
타입스크립트 클래스  (1) 2023.10.23
타입스크립트 인터페이스  (0) 2023.10.23