TypeScript에서 Props를 정의할 때 interface와 type 사이의 선택은 프로젝트를 시작하기 전 규칙을 잡아나아가는 과정에서 흔히 고민되는 주제입니다. 저는 확장성 있게 사용하려고 하면 interface를 사용하고 type은 변경사항이 없는 상황에서 사용했습니다. 이 두 방식 모두 타입을 정의하는 데 사용될 수 있지만, 그 미묘한 차이점과 각각의 장단점을 명확히 이해하는 것은 코드의 유연성과 확장성을 높이는 데 중요합니다. 이 글에서는 interface와 type의 근본적인 차이점을 깊이 있게 탐구하고, 실무에서 어떤 상황에 각각을 사용하는 것이 적절한지 비교해보겠습니다.
Interface vs Type: 기본적인 차이점
Interface
- 객체 형태의 타입을 정의하는 데 주로 사용됩니다.
- 선언 병합(Declaration Merging)이 가능합니다.
- 클래스와 객체 지향 프로그래밍 패턴에 더 친화적입니다.
Type
- 모든 종류의 타입을 정의할 수 있습니다 (Union Type , Intersection Type 등).
- 더 유연하고 복잡한 타입 정의에 적합합니다.
TypeScript 공식 문서의 권장 사항
TypeScript 공식 문서에 따르면, 대부분의 경우 interface를 사용하는 것이 좋다고 나와있습니다.
- 간단성: 기본적인 객체 타입을 정의할 때는 interface가 더 읽기 쉽고 간결합니다.
- 확장성: interface는 선언 병합을 통해 쉽게 확장할 수 있습니다.
실제 예시로 비교해보기
Interface 사용 예시
interface UserProps {
name: string;
age: number;
email?: string;
}
const User: UserProps = {
name: "Sunny",
age: 30
};
Type 사용 예시
type UserProps = {
name: string;
age: number;
email?: string;
};
const User: UserProps = {
name: "John Doe",
age: 30
};
언제 Type을 사용해야 할까?
다음과 같은 경우 type을 사용하는 것이 더 적절할 수 있습니다:
1. 유니온 타입 정의
type Status = "success" | "error" | "loading";
2. 복잡한 타입 조합
type ComplexType = string | number | { id: number };
주의해야 할 점
- 일관성 유지
- 프로젝트 내에서 interface와 type의 사용 기준을 명확히 정하는 것이 중요합니다. 예를 들어, 기본적으로는 interface를 사용하되, 복잡한 타입 정의가 필요할 때만 type을 사용하는 방식으로 통일합니다.
- 확장성 고려
- 타입을 확장하거나 재활용이 필요한 경우 interface가 더 적합합니다.
예를 들어, 기존 정의를 덮어쓰거나 추가 속성을 병합하려면 type으로는 불가능!!!
- 타입을 확장하거나 재활용이 필요한 경우 interface가 더 적합합니다.
- 타입 병합 의도
- 선언 병합이 필요한 경우에는 interface를 사용해야 합니다.
하지만 선언 병합은 프로젝트 규모가 커질수록 의도하지 않은 동작을 일으킬 수 있으므로 주의가 필요합니다.
- 선언 병합이 필요한 경우에는 interface를 사용해야 합니다.
느낀 점
기본적으로는 interface로 시작을 하되, 유니온 타입이나 복잡한 타입 정의가 필요한 경우엔 type으로 전환하는 방향으로 하면 좋을 것 같다. 제일 중요한 건 프로젝트 코드의 일관성과 가독성이라고 생각이 든다.
'TypeScript' 카테고리의 다른 글
[TypeScript] TypeScript와 Zod를 활용한 효율적인 폼 관리: React Hook Form 도입기 (0) | 2024.10.07 |
---|---|
[우아한 타입 스크립트 with 리액트] 타입이란 (1) | 2024.08.26 |
[우아한 타입 스크립트 with 리액트] 타입스크립트의 등장 (0) | 2024.08.24 |
[우아한 타입 스크립트 with 리액트] 자바스크립트의 한계 (0) | 2024.08.23 |
TypeScript에 대해 얼마나 알고 있는지 (0) | 2024.07.11 |