본문 바로가기
개발공부

#5. 인터페이스

by 반류연 2025. 2. 26.

※ 이 강의는 이정환 강사님의 '한 입 크기로 잘라먹는 타입스크립트'를 수강 후 정리한 글입니다.

 

 

인터페이스

  • 타입에 이름을 지어주는 문법
  • '타입 별칭'과 유사하며 대체적으로 기능 역시 거의 동일함

 

선택적 프로퍼티 / 읽기 전용 프로퍼티

interface Person {
 name: string;
 age?: number;
 readonly hobby: string;
}

const person:Person = {
 name: "이정환",
 // age: 27,
 hobby: "개발"
}

person.hobby = "뜨개질" // 에러! 수정 불가능

 

 

메서드 타입 정의 

interface Person {
  readonly name : string;
  age?: number;
  
  // 메서드 정의
  sayHi : () => void; 
}

 

 

메서드 오버로딩

  • '함수 표현식'으로 정의된 메서드는 오버로딩 불가능
  • 호출 시그니처는 가능! 
//잘못된 코드
interface Person {
	readonly name: string;
    age?:number;
    sayHi: () => void;
    
    // 오버로딩
    sayHi: (a:number, b:number) => void // 에러!
}

//옳은 코드
interface Person{
	readonly name: string;
    age?:number;
    sayHi() : void // 호출 시그니처로 메서드 정의
    
    //오버로딩
    sayHi(a:number): void;
    sayHi(a:number, b:number) : void;
}

 

 

하이브리드 타입 정의

interface Func2 {
  (a: number): string;
  b: boolean;
}

const func: Func2 = (a) => "hello";
func.b = true;

 

 

※ 주의할 점

  • 타입 별칭과 달리, Union이나 Intersection 타입을 정의할 수 없음.
  • 위 타입 정의가 필요할 경우, 타입 별칭과 함께 사용하거나 타입 주석에서 직접 사용해야 함.
type Type1 = number | string; // 가능
type Type2 = number & string; // 가능

// 에러
interface Person = {
  name: string;
  age: number;
} | number 


// 올바른 사용법
const person:Person & string = {
  name: "이정환",
  age: 27
}

 

 

인터페이스 확장

  • 하나의 인터페이스를 다른 인터페이스들이 상속받아 중복된 프로퍼티를 작성하지 않도록 도와주는 문법
  • 'interface B extends A' 형태로 사용
interface Animal {
  name: string;
  color: string;
}

interface Dog extends Animal {
  breed: string;
}

interface Cat extends Animal {
  isScratch: boolean;
}

interface Chicken extends Animal {
  isFly: boolean;
}


const dog: Dog = {
  name: "돌돌이",
  color: "brown",
  breed: "진도"
}

 

  • 확장과 동시에 프로퍼티 타입을 재정의 하는 것도 가능함.
    • 주의점: 원본타입이 재정의 타입의 슈퍼타입이어야 한다!
interface Animal {
  name: string;
  color: string;
}

interface Dog extends Animal {
  name: "doldol"; // 타입 재정의
  breed: string;
}

interface Cat extends Animal {
  name: number; // 에러!
  isScratch: true;
}

 

 

타입 별칭 확장 / 다중 확장

// 타입 별칭(객체) 확장
type Animal = {
  name: string;
  color: string;
};

interface Dog extends Animal {
  breed: string;
}

//------------------------------------------
// 다중 확장
interface DogCat extends Dog, Cat {}

const dogCat: DogCat = {
  name: "",
  color: "",
  breed: "",
  isScratch: true,
};

 

 

인터페이스 선언 합치기

  • 타입 별칭과 달리, 동일 스코프 내에 같은 이름으로 중복 선언이 가능함
  • 중복 선언된 인터페이스들은 모두 하나로 합쳐짐.
interface Person {
  name: string;
}

interface Person {
  age: number;
}

const person: Person = {
  name: "이정환",
  age: 27,
};
  • 주의점: 같은 이름의 인터페이스들이 같은 이름의 프로퍼티는 모두 같은 타입으로 정의되어야 함.
    => 다르게 정의된 경우를 '충돌' 이라고 함. 선언 합침시 충돌은 허용되지 않음.
interface Person {
  name: string;
}

interface Person {
  name: number; // 에러
  age: number;
}

 

 

※ 타입별칭과 인터페이스 비교

  • 구분type (타입 별칭)interface (인터페이스)
확장 가능 여부 & (Intersection)으로 확장 extends로 확장 가능
객체만 가능? 유니온(` `), 튜플, 기본 타입 가능
중복 선언 가능? 불가능 (Duplicate error) 가능 (자동 병합됨)
사용 추천 상황 복잡한 타입 조합, 유니온/튜플 사용 시 주로 객체 모델링 시
  • 상황추천
객체의 구조를 정의할 때 interface 🏆
확장이 필요할 때 (extends) interface
여러 개의 타입을 조합할 때 (&, |) type
유니온 타입 (`"a" ,"b"`) type
튜플 ([number, string]) type
기본 타입 (string, number) type

 

  • 결론
    • 객체모델링은 interface
    • 유니온, 튜플, 기본 타입의 조합은 type

'개발공부' 카테고리의 다른 글

#7. 제네릭  (0) 2025.02.28
#6. 클래스  (0) 2025.02.27
#4. 함수와 타입  (0) 2025.02.25
#3. 타입스크립트 이해하기  (0) 2025.02.20
#2. 타입스크립트 기본  (0) 2025.02.18