TypeScript의 타입은 크게 기본 타입(Primitive Types)과 객체 타입(Object Types)으로 나뉩니다. 기본 타입은 값 자체가 타입의 전부인 단순한 값이고, 객체 타입은 여러 값을 담는 구조입니다.
텍스트 값입니다.
let name: string = "철수";
let greeting: string = `안녕하세요, ${name}`;
정수와 실수를 구분하지 않습니다. 모든 숫자가 number 타입입니다.
let age: number = 30;
let pi: number = 3.14;
let hex: number = 0xff;
true 또는 false입니다.
let isLoggedIn: boolean = true;
let hasError: boolean = false;
null은 값이 없음을 명시적으로 나타내고, undefined는 값이 아직 할당되지 않은 상태입니다.
let empty: null = null;
let notAssigned: undefined = undefined;
tsconfig.json에서 strictNullChecks를 활성화하면 null과 undefined를 다른 타입에 할당하는 것을 막습니다. 이 설정 없이는 string 변수에도 null을 넣을 수 있어서 오류를 놓치기 쉽습니다. strict 모드를 켜면 자동으로 활성화됩니다.
유일하고 변경 불가능한 값입니다. 객체 프로퍼티의 키로 충돌 없이 사용할 수 있습니다.
const id: symbol = Symbol("id");
number로 표현할 수 없는 큰 정수를 다룰 때 사용합니다.
const big: bigint = 9007199254740991n;
배열의 타입은 두 가지 방식으로 표기합니다.
// 방식 1: 타입[]
const names: string[] = ["철수", "영희"];
// 방식 2: Array<타입>
const scores: Array<number> = [95, 87, 72];
두 방식은 동일합니다. string[]이 더 간결해서 자주 쓰입니다.
고정된 길이와 각 위치의 타입이 정해진 배열입니다. 파이썬의 튜플과 달리 TypeScript 튜플은 수정(변경)이 가능합니다.
// [string, number] — 첫 번째는 string, 두 번째는 number
const entry: [string, number] = ["철수", 30];
entry[0]; // string
entry[1]; // number
entry[2]; // 오류: 인덱스 2는 존재하지 않습니다
API 응답이나 함수에서 여러 값을 반환할 때 유용합니다.
function getUser(): [string, number] {
return ["철수", 30];
}
const [userName, userAge] = getUser();
프로퍼티의 이름과 타입을 명시합니다.
const user: { name: string; age: number } = {
name: "철수",
age: 30,
};
프로퍼티가 많아지면 인라인 표기가 길어집니다. 이 경우 interface나 type으로 분리합니다. 이에 대해서는 별도 글에서 다루겠습니다.
타입 검사를 완전히 끕니다. TypeScript를 쓰는 이유를 무력화하므로 최대한 피해야 합니다.
let value: any = "문자열";
value = 42; // 오류 없음
value.foo(); // 오류 없음 — 런타임에서 터질 수 있음
any처럼 어떤 값이든 받을 수 있지만, 사용하기 전에 반드시 타입을 좁혀야 합니다. any보다 안전한 대안입니다.
let input: unknown = "문자열";
// input.toUpperCase(); // 오류: 타입을 확인하지 않으면 사용 불가
if (typeof input === "string") {
input.toUpperCase(); // 정상
}
절대 발생할 수 없는 값의 타입입니다. 항상 예외를 던지는 함수나 무한 루프, 또는 모든 경우가 처리되었을 때 남은 타입으로 나타납니다.
function throwError(message: string): never {
throw new Error(message);
}
반환값이 없는 함수의 반환 타입입니다.
function log(message: string): void {
console.log(message);
// return; 또는 return undefined; 가능
}
특정 값만 허용하는 타입을 만들 수 있습니다.
let direction: "left" | "right" | "up" | "down";
direction = "left"; // 정상
direction = "back"; // 오류: '"back"'은 이 타입에 할당할 수 없습니다
let statusCode: 200 | 404 | 500;
statusCode = 200; // 정상
statusCode = 201; // 오류
리터럴 타입(Literal Type): 특정 값 자체를 타입으로 사용하는 기능. 문자열, 숫자, boolean 값 모두 리터럴 타입으로 쓸 수 있습니다.
기본 타입을 정확히 이해하면 TypeScript 타입 시스템의 나머지 기능들을 쌓아올리기 쉬워집니다. 특히 any 대신 unknown을 쓰는 습관이 타입 안전성을 크게 높여줍니다.