기본 타입 완벽 가이드 (기본, 특수, Union, Literal)
여러 데이터를 묶어서 관리하는 자료구조들의 타입 정의 방법입니다.
// 1. Array (배열) - 같은 타입만 모아둠
let fruits: string[] = ["사과", "바나나"];
let numbers: Array = [1, 2, 3]; // 제네릭 표기법
// 2. Tuple (튜플) - 길이와 타입이 고정된 특별한 배열
let userAccount: [string, number] = ["minstudio", 9999];
// userAccount = [9999, "minstudio"]; // ❌ 순서가 틀리면 에러!
// 3. Enum (열거형) - 특정 값들의 집합에 이름을 붙임
enum Role {
ADMIN = "관리자",
USER = "일반회원",
GUEST = "비회원"
}
let myRole: Role = Role.ADMIN;
타입스크립트에서만 존재하는 4가지 특수 목적의 타입입니다. any는 마치 바이러스 같아서 프로젝트 전체의 타입 안전성을 파괴하므로 극도로 피해야 하며, 불가피할 경우 unknown을 사용하는 습관을 들여야 합니다.
// 1. any: 타입 검사를 포기함 (TS를 쓰는 의미가 없어짐, 사용 금지!)
let garbage: any = 123;
garbage = "문자"; // 통과
garbage.push(1); // 통과 (심지어 배열 메서드를 써도 안 막음!)
// 2. unknown: any와 비슷하지만, 사용하기 전에 무조건 타입을 확인해야 하는 안전한 any
let mystery: unknown = 10;
// let num: number = mystery; // ❌ 에러! "mystery가 숫자인지 증명해!"
if (typeof mystery === "number") {
let num: number = mystery; // ✅ 증명 완료! 허가됨
}
// 3. void: 아무것도 리턴(반환)하지 않는 함수
function sayHi(): void {
console.log("안녕하세요"); // return이 없음!
}
// 4. never: 절대 끝에 도달하지 않거나 무조건 에러를 던지는 함수
function throwError(): never {
throw new Error("시스템 붕괴!");
}
기존에 존재하는 타입들을 조합하여 더 복잡하고 정교한 새로운 타입을 만들어내는 연산자들입니다.
// 1. Union Type (|) : A이거나 B (둘 중 하나만 만족하면 통과)
type StringOrNumber = string | number;
let myValue: StringOrNumber = "안녕하세요";
myValue = 100; // 숫자로 바꿔도 에러 없음!
// 2. Intersection Type (&) : A이면서 B (두 조건을 완벽하게 합침)
interface Person { name: string; }
interface Developer { skills: string[]; }
// DeveloperPerson은 name과 skills를 "모두" 가져야만 합니다!
type DeveloperPerson = Person & Developer;
const minsu: DeveloperPerson = {
name: "민수",
skills: ["TS", "React"] // 하나라도 빠지면 에러 발생!
};
타입의 범위를 string이나 number처럼 넓게 잡지 않고, 특정 문자열이나 숫자 자체를 타입으로 박아버리는 기능입니다. 자동 완성 기능을 극대화하고 오타로 인한 버그를 완벽하게 막아줍니다.
// 단순히 문자열(string)이라고 퉁치는 것이 아니라,
// 오직 "success", "error", "loading" 3개의 단어만 들어오도록 제한!
type Status = "success" | "error" | "loading";
let currentStatus: Status = "loading"; // 통과
// currentStatus = "finish"; // ❌ 에러! "finish"는 허락된 단어가 아님!