본문 바로가기
nest.js

TypeScript Generics, Typescript-utility 2

by goblin- 2024. 6. 2.

TypeScript 타입 정리

Primitive 타입

  • string, number, boolean
const getPrimitive = (arg1: string, arg2: number, arg3: boolean): [boolean, number, string] => {
    return [arg3, arg2, arg1];
}

Any 타입

  • 자바스크립트와 같음. 아무거나 다 될 수 있어서 위험함.
const getAny = (arg1: any, arg2: any, arg3: any): [any, any, any] => {
    console.log(arg1 + 100);  // any 타입은 아무거나 되기 때문에 위험함
    return [arg3, arg2, arg1];
}

Unknown 타입

  • 안전한 any 타입. 타입 검사를 통해 사용할 수 있음.
const getUnknown = (arg1: unknown, arg2: unknown, arg3: unknown): [unknown, unknown, unknown] => {
    if (typeof arg1 === "number") console.log(arg1 + 100); // 타입 검사 후 안전하게 사용
    // console.log(arg1 + 100);  // 타입 검사 없으면 오류 발생
    return [arg3, arg2, arg1];
}

 

Generic 타입

  • 나만의 타입을 만드는 것.
function getGeneric<MyType1, MyType2, MyType3> (arg1: MyType1, arg2: MyType2, arg3: MyType3): [MyType3, MyType2, MyType1] {
    return [arg3, arg2, arg1];
}

const result = getGeneric<string, number, boolean>("철수", 123, true); // 미리 타입을 지정
const getGeneric2 = <T, U, V>(arg1: T, arg2: U, arg3: V): [V, U, T] => {
    return [arg3, arg2, arg1];
}

const result2 = getGeneric2("철수", 123, true); // 타입 추론

 

Utility 타입

  • 기존 타입을 조작해서 새로운 타입을 만드는 것.
interface IProfile {
    name: string;
    age: number;
    school: string;
    hobby?: string;
}

// Partial 타입 (모든 속성이 선택 사항이 됨)
type PartialProfile = Partial<IProfile>;

// Required 타입 (모든 속성이 필수로 변경됨)
type RequiredProfile = Required<IProfile>;

// Pick 타입 (특정 속성만 필수로 선택)
type PickProfile = Pick<IProfile, "name" | "age">;

// Omit 타입 (특정 속성을 제외)
type OmitProfile = Omit<IProfile, "school">;

// Record 타입 (키가 eee이고 값이 IProfile인 객체)
type Names = "철수" | "영희" | "훈이";
type ProfileRecord = Record<Names, IProfile>;

// 객체의 key들로 Union 타입 만들기
type ProfileKeys = keyof IProfile;  // "name" | "age" | "school" | "hobby"
let myProfileKey: ProfileKeys = "hobby";

// Type 과 Interface의 차이 (interface는 선언 병합 가능)
interface IProfile {
    candy: number;  // 선언 병합으로 추가됨
}

let profile: Partial<IProfile> = {
    candy: 10,
};