반응형
type 키워드가 아니라 interface로도 같은 방법으로 사용할 수 있다.
둘의 사용하는 방법의 차이는 아래와 같다.
// type
type Person = {
name : string,
age : number
}
// interface
interface Person { // = 이 없음
name : string; // 세미콜론으로 함(,도 가능하긴함)
age : number;
}
interface가 type 대비 좋은 점은 extends가 가능하다. class 문법과 비슷한 개념이다.
type도 & 키워드로 비슷한 기능을 사용할 수 있으나, 내부적으로 구동하는 방식에 차이가 있다.
가령 A, B 타입이 있고 C = A & B 라고 하면 이 것은 extends의 의미가 아니라 A도 만족하고 B도 만족하는 C 타입을 만든다는 의미이다.
반면, A extends B 라고 하면 B의 내용을 A에 복사해주는 방식으로 동작한다.
type A = { name : string };
type B = { age : number };
type C = A & B;
let v1: C = { name : "lee", age : 43 };
interface A {
name : string
}
interface B extends A {
age : number
}
let v2: B = { name : "lee", age : 34 };
interface는 중복 선언이 가능하다. 같은 이름의 interface를 여러개 만들 수 있다. 그런 경우 interface의 데이터가 확장된다고 보면 된다.
interface Person { name : string }
interface Person { age : number }
let v1: Person = { name : "lee", age : 34 }; // 자동으로 extends 되었다고 생각해도 됨
interface Person { name : number } // 에러. 중복된 값을 넣으려고 하면 에러남
위처럼 중복 선언을 이용해 재정의 혹은 확장을 할 수 있기 때문에 엄격한 type에 비해 유연하다.
중복된 키값을 여러번 넣으려고 하면 interface는 에러가 발생하고, type은 데이터 타입이 never로 변경된다. never는 간단하게 절대 완료되지 못하는 오류 라고 생각하면 된다.
반응형
댓글