[TypeScript] type과 interface 비교
728x90

TypeScript에서 type과 interface에 대한 차이를 살펴보겠습니다.
기본적인 사용 방법
기본적으로 type과 interface을 사용해 타입을 정의하고 지정하는 방법은 같습니다.
interface IStudent { id: number; name: string; } type TStudent = { id: number; name: string; }; const interfaceStudent: IStudent = { id: 0, name: 'name', }; const typeStudent: TStudent = { id: 0, name: 'name', };
타입을 확장하는 방법
type과 interface는 타입을 확장하는 방법에 차이가 있습니다.
type은 &
연산자, interface는 extends
키워드를 이용합니다.
interface IStudent2 extends IStudent { age: number; } type TStudent2 = TStudent & { age: number; };
또한, interface의 경우 동일한 이름으로 다시 interface를 정의해 확장하는 것이 가능합니다.
interface IStudent { id: number; name: string; } interface IStudent { age: number; }
type은 동일한 이름으로 다시 선언할 수 없습니다.
type vs interface
type과 interface를 구분해서 사용해야 할 필요가 있을까요? 대부분의 경우에는 구분하지 않고 사용해도 괜찮을 것입니다.
interface IHttpHeader { Accept: string; Cookie: string; }; type THttpHeader = { Accept: string; Cookie: string; }; function send(headers: Record<string, string>) { return headers; } const hdrs = { Accept: 'text/html', Cookie: '', }; send(hdrs as THttpHeader); // OK send(hdrs as IHttpHeader); // ERROR
위 코드를 보면, type으로 선언한 hdrs는 Record<string, string>
에 넘길 때 에러가 발생하지 않지만, interface로 선언한 hdrs는 에러가 방생합니다.
Argument of type 'IHttpHeader' is not assignable to parameter of type 'Record<string, string>'. Index signature is missing in type 'IHttpHeader'.
에러의 내용은 위와 같으며(깃허브 이슈), 간단히 다음과 같은 규칙을 갖고 있습니다.
- type은 generic type에 저장할 수 있습니다.
type GenericType = { [x: string]: number }; type NormalType = { x: number }; const normalType: NormalType = { x: 1, }; const genericType: GenericType = normalType; // no error
- interface는 generic interface에 저장할 수 없습니다.
interface GenericInterface { [x: string]: number; } interface NormalInterface { x: number; } const normalInterface: NormalInterface = { x: 1 }; const genericInterface: GenericInterface = normalInterface; // error
- interface는 generic interface를 확장할 수 있습니다.
interface GenericInterface { [x: string]: number; } interface NormalInterface extends GenericInterface { x: number; } const normalInterface: NormalInterface = { x: 1 }; const genericInterface: GenericInterface = normalInterface; // no error
- type은 generic interface에 저장할 수 있습니다.
interface GenericInterface { [x: string]: number; } type NormalType = { x: number }; const normalType: NormalType = { x: 1 }; const genericInterface: GenericInterface = normalType; // no error
- interface는 generic type에 저장할 수 없습니다.
type GenericType = { [x: string]: number }; interface normalInterface { x: number; } const normalInterface: normalInterface = { x: 1 }; const genericType: GenericType = normalInterface; // error
때문에 현재 interface를 사용하는 것은 의도치 않은 에러를 만날 수 있습니다.
해당 문제를 개선하기 위해 이슈 제안 및 PR이 활발하게 이뤄지고 있으니, 개선될 가능성도 있을 것입니다.
728x90
728x90
'Advanced > JavaScript' 카테고리의 다른 글
[JavaScript] 함수를 콜백으로 전달할 때 (0) | 2021.02.12 |
---|---|
[JavaScript] Virtual DOM 만들기 (2) | 2021.01.26 |
[JavaScript] 바닐라 자바스크립트로 웹 컴포넌트 만들기 (0) | 2021.01.25 |
[JavaScript] Element를 저장 및 불러오기 (0) | 2021.01.04 |
[JavaScript] Selection과 Range (0) | 2020.12.29 |
댓글
이 글 공유하기
다른 글
-
[JavaScript] 함수를 콜백으로 전달할 때
[JavaScript] 함수를 콜백으로 전달할 때
2021.02.12 -
[JavaScript] Virtual DOM 만들기
[JavaScript] Virtual DOM 만들기
2021.01.26 -
[JavaScript] 바닐라 자바스크립트로 웹 컴포넌트 만들기
[JavaScript] 바닐라 자바스크립트로 웹 컴포넌트 만들기
2021.01.25 -
[JavaScript] Element를 저장 및 불러오기
[JavaScript] Element를 저장 및 불러오기
2021.01.04
댓글을 사용할 수 없습니다.