[TypeScript] Indexed Access & 여러 타입.

2025. 3. 8. 18:37·프로그래밍 언어/TypeScript

출처: 이정환의 한 입 크기로 잘라먹는 타입스크립트

 

1. 인덱스드 엑세스 타입 (Indexed Access Type) :

객체 또는 배열에서 특정 요소의 타입을 가져오는데 사용됨.

type PostList = {    //interface 는 객체타입 정의에만 특화되어있기 때문에 배열을 정의하긴 불편
  title: string;
  content: string;
  author: {
    id: number;
    name: string;
    age: number;
  };
}[];

function printAuthorInfo(author: PostList[number]["author"]) {
  //인덱스라고 부름
  console.log(`${author.name}-${author.id}`);
}

const post: PostList[number] = {
  title: "게시글 제목",
  content: "게시글 본문",
  author: {
    id: 1,
    name: "홍길동",
    age: 27,
  },
};

printAuthorInfo(post.author);  // 홍길동-1
  • `PostList[number]` 는 `PostList` 배열의 요소 타입을 가져온다.
  • `PostList[number]["author"]`는 해당 요소의 `author` 속성 타입을 가져온다.

PostList[number] 에서 왜 number를 지칭하나 ? 

1. PostList는 배열 타입이다.

2. 배열의 인덱스 타입은 `number` 이다.

3. 따라서 PostList[number] 는 이 배열의 요소 타입을 가져오는 역할을 함.

 

즉. 배열의 인덱스를 `number` 타입으로 접근할 수 있기 때문에 PostList[number]가 배열 요소 타입을 가져올 수 있음.

 

그래서 `number`말고 숫자를 넣어도 된다. But 특정 숫자를 넣으면 특정 인덱스 요소 타입을 가져옴.

 

12 튜플에서의 사용

튜플에서도 특정 인덱스의 타입을 추출할 수 있다

type Tup = [number, string, boolean];

type Tup0 = Tup[0]; // number
type Tup1 = Tup[1]; // string
type Tup2 = Tup[2]; // boolean
//type Tup3 = Tup[3]; // 오류 ( 튜플 범위 초과 )

type TupNum = Tup[number]; // number | string | boolean
  • `Tup[number]` 는 튜플의 모든 요소 타입을 유니언 타입으로 반환한다.

 

2. `keyof` 연산자 :

객체 타입의 키를 문자열 유니언 타입으로 변환한다.

const person = {
	name: "홍길동",
    age: 27,
};

type Person = typeof person;

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

getPropertyKey(person, "name"); // 홍길동
  • `keyof Person` 은 ` { name: string; age: number; }` 의 키인 `'name' | 'age'` 를 반환한다.

 

3. 맵드 타입 (Mapped Types) : 인터페이스에서 사용 불가능.

기존 타입을 변형하여 새로운 타입을 생성할 때 유용하다 

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

 

부분타입, 불리언 변환 타입, 읽기전용에 대한 예제

// 부분 타입 (Partial)

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


// 불리언 변환 타입

// 위의 "id" | "name" | "age" 이걸 keyof로 간단하게 참조할 수 있다.
type BooleanUser = {
	[key in keyof User]: boolean;
};


// 읽기 전용 타입 (Readonly)

type ReadonlyUser = {
	readonly [key in keyof User]: User[key];
};
  • "id" | "name" | "age" -> keyof  로 응용가능.

예제

// 한 명의 유저 정보를 불러오는 기능
function fetchUser(): ReadonlyUser {
  return {
    id: 1,
    name: "홍길동",
    age: 27,
  };
}
const user = fetchUser();
//user.id = 1; // 읽기 전용으로 설정해 놨기 때문에 오류 발생.

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

updateUser({
  age: 25,
});

 

 

4. 템플릿 리터럴 타입 (Template Literal Types)

기존 문자열 리터럴 타입을 조합하여 새로운 문자열 패턴을 만들 때 유용.

type Color = "red" | "black" | "green";
type Animal = "doh" | "cat" | "chicken";

type ColoredAnimal = `${Color}-${Animal}`;
  • `ColoredAnimal 은 `"red-dog" | "red-cat" | "red-chicken" | "black-dog" ....` 과 같은 패턴을 자동으로 생성

활용 예제.

type ButtonSize = "small" | "medium" | "large";
type ButtonVariant = "primary" | "secondary";

type ButtonClass = `btn-${ButtonSize}-${ButtonVariant}`;

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

[TypeScript] 유틸리티 타입 정리  (0) 2025.03.10
[TypeScript] 조건부 타입 , 타입 추론 (infer)  (0) 2025.03.09
[TypeScript] 제네릭 인터페이스와 제네릭 타입 별칭 그리고 제네릭 클래스  (0) 2025.03.06
[TypeScript] 제네릭 함수와 타입 변수 응용하기  (0) 2025.03.05
[TypeScript] 클래스와 인터페이스 그리고 접근 제어자.  (0) 2025.03.05
'프로그래밍 언어/TypeScript' 카테고리의 다른 글
  • [TypeScript] 유틸리티 타입 정리
  • [TypeScript] 조건부 타입 , 타입 추론 (infer)
  • [TypeScript] 제네릭 인터페이스와 제네릭 타입 별칭 그리고 제네릭 클래스
  • [TypeScript] 제네릭 함수와 타입 변수 응용하기
“하루하루가 새로운 인생이다.”
“하루하루가 새로운 인생이다.”
제가 배운 지식을 정리하고 오래 기억하고 싶어서 만든 블로그입니다.
  • “하루하루가 새로운 인생이다.”
    땅콩
    “하루하루가 새로운 인생이다.”
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • 일상 (2)
      • 에러처리 (0)
      • 프로그래밍 언어 (34)
        • TypeScript (21)
        • JavaScript (6)
        • 퍼블리싱 ( HTML, CSS ) (7)
        • 코테 (0)
      • 프레임워크 및 라이브러리 (10)
        • React (10)
        • Next.js (0)
        • Vue.js (0)
        • Spring Boot (0)
      • 데이터베이스 (0)
        • Oracle (0)
      • 디자인 (0)
        • Figma (0)
      • 개발 도구 (5)
        • Git (4)
        • Docker (0)
        • IDE (1)
      • 프로젝트 (0)
        • 개인 프로젝트 (0)
        • 팀 프로젝트 (0)
        • 프로젝트 회고 (0)
      • 정보처리기사 (12)
        • 1과목 (4)
        • 2과목 (2)
        • 3과목 (2)
        • 4과목 (2)
        • 5과목 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    정보처리기사
    React
    정처기
    한 입 크기로 잘라먹는 타입스크립트
    GIT
    웹
    자바스크립트
    타입 별칭
    js
    벼락치기
    타입스크립트
    HTML
    Hook
    인터페이스
    리액트
    javascript
    이정환
    TypeScript
    css
    타입 스크립트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
“하루하루가 새로운 인생이다.”
[TypeScript] Indexed Access & 여러 타입.
상단으로

티스토리툴바