타입스크립트만의 독자적 타입 시스템
kwangmook.dev·2026. 05. 10.·2 min read
any 타입
any는 "타입 검사를 잠깐 꺼두는 스위치"에 가깝다.
let value: any = "hello";
value = 123;
value.foo.bar(); // 컴파일은 통과, 런타임에서 터질 수 있음
any를 어쩔 수 없이 쓰는 대표 3가지
- 개발 초기에 임시로 타입을 비워둘 때
- 요구사항이 아직 자주 바뀌고 데이터 모양이 확정되지 않은 단계
- 입출력 타입을 아직 특정하기 어려울 때
- 외부 라이브러리 타입이 불완전하거나, 콜백/응답 타입이 불명확한 경우
- 기존 JS 코드 마이그레이션 중일 때
- 한 번에 완전한 타입을 못 붙이는 구간에서 임시 안전판으로 사용
중요한 포인트:
any를 썼다면 TODO를 남기고, 가능한 빨리unknown이나 구체 타입으로 교체하는 게 좋다.
unknown 타입
unknown은 "일단 모른다"를 타입으로 표현한다.
아무 값이나 담을 수 있지만, 꺼내 쓸 때는 검증을 강제한다.
let input: unknown;
input = "text";
input = 42;
input = { name: "kim" };
바로 사용은 안 된다.
// input.toUpperCase(); // 에러
검증 후 사용한다.
if (typeof input === "string") {
console.log(input.toUpperCase());
}
any: 자유롭지만 위험unknown: 한 번 더 확인하게 만들어서 안전
외부 데이터(JSON/API/폼 입력)는 unknown으로 받고 좁히는 습관을 들이기.
void 타입
void는 "반환값을 사용하지 않는다"는 의미에 가깝다.
function logMessage(message: string): void {
console.log(message);
}
자바스크립트 함수가 반환문이 없으면 undefined를 반환하지만,
타입스크립트에서 : void는 "이 함수의 반환값을 기대하지 않음" 의 의미.
자주 쓰는 곳:
- 로깅 함수
- 이벤트 핸들러
- 콜백(반환값 무시)
never 타입
never는 "절대 발생하지 않는 값"을 뜻한다.
대표적으로 두 상황에서 등장한다.
- 함수가 정상 종료되지 않을 때
function fail(message: string): never {
throw new Error(message);
}
- 모든 경우를 처리하고 남는 케이스가 없어야 할 때
type Status = "idle" | "loading" | "success";
function render(status: Status) {
switch (status) {
case "idle":
return "대기";
case "loading":
return "로딩";
case "success":
return "완료";
default: {
const neverValue: never = status;
return neverValue;
}
}
}
Array 타입
const numbers: number[] = [1, 2, 3];
const names: Array<string> = ["jung", "kim"];
실무에서 자주 쓰는 패턴
- 읽기 전용 배열
const roles: readonly string[] = ["admin", "user"];
// roles.push("guest"); // 에러
- 객체 배열 타입
type User = { id: number; name: string };
const users: User[] = [
{ id: 1, name: "jung" },
{ id: 2, name: "kim" },
];
- 튜플(길이/순서가 고정된 배열)
const point: [number, number] = [10, 20];
enum 타입
enum은 "이름 있는 상수 묶음"이다.
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
장점:
- 의미 있는 이름으로 상수를 관리하기에 좋음
- 런타임에서도 값으로 접근 가능
console.log(Direction.Up); // "UP"
주의점:
- 단순 상태 문자열 제한이면 문자열 유니온이 더 가볍고 직관적
type DirectionType = "UP" | "DOWN" | "LEFT" | "RIGHT";
- 런타임 상수 객체가 필요하다 ->
enum고려 - 타입 제한이 목적이다 -> 문자열 유니온 우선
마무리
any는 마지막 수단- 외부 입력은
unknown부터 - 반환하지 않는 함수는
void - 절대 발생하지 않는 케이스 확인은
never - 배열은 일관된 문법과
readonly활용 enum은 런타임 필요 여부로 선택
이전/다음 포스트
댓글 남기기
댓글 0개
첫 댓글을 남겨보세요.