일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Blob 사용하는 이유
- JS 이미지 미리보기
- 이미지 서버에 업로드
- Typescript Handbook
- Null vs Undefined
- ts.config.json
- ts 필수 설정
- 공부
- TypeScript Undefined Null
- Blob 청크
- ts 기초 설정
- ts 설정
- Typescript Study
- TypeScript config
- ts 설정값
- JS Blob
- ts 프로젝트 설정 추천
- 인터페이스 vs 타입
- 타입스크립트 필수 설정
- 프론트 이미지 업로드
- why use interface?
- Blob이란?
- 인터페이스 타입 비교
- firebase server
- Interface vs Type Alias
- Blob?
- TypeScript Deep Dive
- TypeScript
- ts.config.json default setting
- 타입스크립트 설정값
- Today
- Total
RPG처럼 웹 개발하기
Interface VS Type alias 비교하기 본문
이 글을 읽으려고 들어오신 분들은 TypeScript를 사용하여 코드를 작성하시는 분이거나,
TypeScript를 사용하기 위해 알아보기 위한 분들이실겁니다.
일단 저는 TypeScript 를 천천히 도입해보고 있는 개발자입니다.
TypeScript 를 천천히 공부하며 사용해보고 있는 와중에 저는 의문이 생겼습니다.
“Interface 그리고 Type alias 이것들은 대체 무엇이 어떻게 다른것이지?” 라는 의문 말이죠.
여러분은 Interface 와 Type alias 의 차이를 잘 알고 계신가요?
저는 대체 어떻게 무엇이 다른건지 알고 있지 못했습니다.
그래서 이번 글로 한번 무엇이 다른건지 정리를 해보려고 합니다.
잘 모르겠거나, 헷갈리는분들, 그리고 이미 알고 계시는 분들도 차근차근 보면서 같이 정리해볼까요?
용어설명
1. Type Alias
- 한국어로 “타입 별칭” 이라고 번역되어 사용 되어지고 있습니다.
type Name = string;
type ExplainType = {
id: number;
name: Name;
};
// 위처럼 사용할 수 있는 형태입니다.
2. Interface
- 객체 형태로만 정의가 가능합니다.
- 한국어로 “인터페이스” 영어를 그대로 읽어서 사용 되어지고 있습니다.
interface IExplainType {
id: number;
name: string;
};
// 위와 같은 형태입니다.
// 선언할때 IObject 처럼 앞에 주로 대문자 I 를 붙여서 사용합니다. (인터페이스 라는 뜻 입니다.)
무엇이 다른지 일단 나열!
- Interface 는 객체 형태만 타입 설정이 가능하다.
- Computed Property
- 타입 프리뷰
- 확장
Type Preview ( 타입 미리보기 )
Interface로 타입을 정의 한 경우에는 Type Preview 창이 나오지 않습니다.
하지만 Type Alias로 타입을 정의한 경우에는 Type Preivew 를 사용할 수 있습니다.
저는 이 기능이 엄청 편하게 느껴졌습니다.
파일을 들어가보지 않아도 표시가 되는게 코드를 작성할때 생각보다 편하고 좋더라구요!
Index Signature 란?
type ObjectType = {
[key: stirng]: string;
};
// 위와 같은 형식으로 object 에서 어떤 값이 들어올지 모를때 주로 사용된다.
const key = 'signature';
const targetObject: ObjectType = {
'signature': 'Hello!',
};
console.log(targetObject[key]);
객체의 속성을 알 수 없는 상황일때만 사용하는것이 좋다고 생각합니다.
객체를 Index Signature 를 사용한다면 에러는 발생하지 않겠지만 존재하지 않는 키값을 참조하는 상황이 발생할 수도 있고,
해당 상황은 버그로 이어지기 쉽기 때문입니다.
선언이 가능한 객체에는 타입을 선언해주되,
타입을 선언하기 어려운경우에만 Index Signature 를 사용하는것이 좋다고 생각합니다.
String, Number, Symbols 타입만 가능합니다.
Computed Property
Computed Property 라고 부르는 분도 있고,
Computed Value , Template literal 이라고 부르는 분도 있습니다.
저는 이글에서는 일단 Computed Property 라고 불러보겠습니다.
아래와 같은 형태 입니다.
type Name = 'si' | 'bi' | 'pi';
type ObjectType = {
[key in Name]: string;
};
Index Signature 와 비슷하게 생겼습니다.
저는 처음에 “Index Signature 하고 뭐가 다른거지? 다른 이름인데 똑같은 건가?” 라고 생각했었습니다.
근데 자세히 보니까 [key in Name] 이 부분이 달랐습니다. 들어올 key 값을 정해 놓는 형태입니다.
// Index Signature
type IndexSignature = {
[key: string]: string;
};
// Computed Property
type order = 'app' | 'web' | 'appWeb';
type ComputedProperty = {
[key in order]: string;
}
이렇게 쓰고 나니까 다른부분이 보였습니다!
Index Signature 는 interface, type alias 둘 다 사용 가능하지만,
Computed Property 는 type alias 에서만 사용 가능합니다!
타입 확장을 하는 방법
Interface 의 경우
interface INav {
state: string;
};
interface ISidenav extends INav {
isActive: boolean;
};
// 위 형태로 주로 확장을 하는데 애래처럼 똑같은 이름으로 재선언하면 자동적으로 합체시켜준다.
// 이를 선언 병합이라고 합니다.
interface INav {
isActive: boolean;
};
// 근데 개인적으로 extends로 확장해주는게 좋다고 생각이 듭니다.
Type Alias 의 경우
type Nav = {
state: string;
};
type Sidenav = Nav & {
isActive: boolean;
};
// interface처럼 재선언해서 확장을 하는방식은 불가능하다.
엄밀히 말하면 Type Alias 의 경우 Interface 처럼 확장이 되는것은 아닙니다.
Type Alias는 확장을 하는것이 아니라, 타입을 더해서 새로운 타입을 정의하는 방식입니다.
위 코드로 보면 선언된 Nav 타입과 isActive 를 더해서 새로운 타입을 만들어내는 건데요.
공식 문서를 보면 & 를 사용해서 Type을 더해 새로운 타입을 만들어낸다면 의도치 않은 버그가 생길수 있다고 합니다.
Type Alias는 Interface 처럼 확장해주는 것이 아니라
Type Alias 는 모두 다 한번씩 돌면서 선언된 타입과 & 를 사용하여 정의된 타입을 더해주는것이기 때문에,
문제가 생길수도 있다고 설명이 되어있습니다.
성능상으로도 interface가 더 좋습니다.
확장 부분은 interface의 압승이네요!
Type Alias 의 문제점
- 확장의 경우 Interface는 단순 객체만 들어오기 때문에 합치기만 하면 되는데, Type Alias는 순회 하면서 속성을 합쳐주기 때문에 충돌날 수 있습니다.
- Interface 를 합칠경우 캐시가 되지만, Type 의 경우 모든 구성요소의 Type 을 체크하기 때문에 컴파일시 상대적으로 성능이 좋지 않습니다.
그래서 제 개인적인 생각은…
일단 공식 문서에서는 특별한 경우를 제외하고 interface 를 추천하고 있습니다.
근데 Type Alias 에서만 가능한것들이 존재합니다.
Interface는 불가능한 객체가 아닌 타입을 정의하거나,
Indexed Signature 또는 Computed Property 를 사용하는 상황일때는 Type Alias를 사용하는것도 좋다고 생각합니다.
저는 아래와 같은 방법을 사용할것 같습니다.
- 팀에서 기본적으로 Interface 를 사용하여 타입을 선언한다.
- 단일 타입을 선언하는 경우 Type Alias 를 사용한다.
- Index Signature, Computed Property 를 사용할때는 Type Alias 를 사용한다.
결론적으로 중요한것은, 팀에서 약속을 정해서 사용하는것이 제일 중요하다고 생각합니다.
1번 개발자는 어떤 이유로 Interface 를 선호해서 사용하고,
2번 개발자는 어떤 이유로 Type Alias 를 사용하더라도,
1번, 2번 개발자가 같이 작업할때 어떻게 하겠다!
이렇게 약속을 하고 프로젝트에 동일한 방식의 타입 선언을 하는것이 제일 중요하다고 생각합니다.
참조 페이지 :
'웹 개발' 카테고리의 다른 글
TypeScript 설정에 필수로 작성 해야 하는것 (0) | 2022.12.16 |
---|---|
Null vs Undefind (0) | 2022.11.24 |
Blob으로 이미지 업로드 훑어보기 (0) | 2022.10.02 |
PWA 푸시알림 어떻게 구현하지? (0) | 2022.09.05 |
시멘틱 태그( Sematic Tag )를 잘 사용하는 방법? (0) | 2022.08.24 |