Web

타입스크립트의 고급 타입 정리

noeul_noeul__ 2024. 6. 28. 01:45

TypeScript는 JavaScript에 정적 타입을 추가하여 코드의 안정성과 가독성을 높이는 언어입니다. 

TypeScript에는 기본 타입 외에도 고급 타입이 존재하여 복잡한 타입 정의와 더 강력한 타입 체크를 가능하게 합니다. 

 

오늘은 

TypeScript의 고급 타입들을 정리한 자료입니다. 

 

 

1. 유니온 타입 (Union Types)

여러 타입 중 하나를 가질 수 있는 변수를 정의할 때 사용합니다.

typescript
let value: string | number;
value = "Hello";
value = 123;

 


2. 인터섹션 타입 (Intersection Types)
여러 타입을 결합하여 하나의 타입으로 만들 때 사용합니다.

interface Person {
    name: string;
}

interface Employee {
    employeeId: number;
}

type EmployeePerson = Person & Employee;

const emp: EmployeePerson = {
    name: "John",
    employeeId: 1234
};



3. 제네릭 (Generics)
타입을 함수나 클래스의 매개변수로 사용할 때 사용합니다.

function identity<T>(arg: T): T {
    return arg;
}

let output = identity<string>("Hello");



4. 맵드 타입 (Mapped Types)
기존 타입을 변환하여 새로운 타입을 만들 때 사용합니다.

type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

interface Person {
    name: string;
    age: number;
}

type ReadonlyPerson = Readonly<Person>;



5. 조건부 타입 (Conditional Types)
타입에 조건을 걸어 다른 타입을 반환하게 합니다.

type IsString<T> = T extends string ? "string" : "not string";

type Test1 = IsString<string>; // "string"
type Test2 = IsString<number>; // "not string"



6. 인덱스 타입 (Index Types)
객체의 속성을 동적으로 접근할 때 사용합니다.

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
    return obj[key];
}

const person = { name: "John", age: 30 };
const personName = getProperty(person, "name"); // John



7. 튜플 타입 (Tuple Types)
고정된 요소 수와 타입을 가지는 배열을 정의할 때 사용합니다.

let tuple: [string, number];
tuple = ["hello", 10];

 


8. 유틸리티 타입 (Utility Types)
- `Partial<T>`: T의 모든 속성을 선택적(optional)으로 만듭니다.
- `Required<T>`: T의 모든 속성을 필수(required)로 만듭니다.
- `Readonly<T>`: T의 모든 속성을 읽기 전용(readonly)으로 만듭니다.
- `Pick<T, K extends keyof T>`: T에서 특정 속성 K만 선택하여 새로운 타입을 만듭니다.
- `Omit<T, K extends keyof any>`: T에서 특정 속성 K를 제외한 타입을 만듭니다.
- `Record<K extends keyof any, T>`: K 타입의 키와 T 타입의 값을 가지는 객체 타입을 만듭니다.

interface Todo {
    title: string;
    description: string;
    completed: boolean;
}

type PartialTodo = Partial<Todo>;
type ReadonlyTodo = Readonly<Todo>;