Ted's Codding study

인터페이스 (interface) 본문

TypeScript

인터페이스 (interface)

Ted93 2024. 6. 21. 20:46

1. 인터페이스 정의

  • 객체 구조를 정의하는 타입스크립트의 기능 / 함수 타입 정의 시에도 사용
  • 객체가 어떤 프로퍼티와 메서드를 가져야 하는지 명시 컴파일 시간에 타입 체킹을 위해 사용되는 개념
  • 코드의 가독성과 유지 보수성을 향상
  • 다양한 구현체에 동일한 인터페이스를 적용하여 일관성과 재사용성을 제공

1-1) 그 동안 써왔던 타입 속성 예시

type UserType = {
  name: string;
  age: number;
};

type AdminUserType = UserType & { admin: boolean };
type manyType = number | string | boolean;

 

1-2) 인터페이스 명시

  • interface 키워드를 사용하여 명시
  • 인터페이스명은 대문자로 시작
  • type 속성의 선택적 프로퍼티(옵셔널)와 읽기 전용 프로퍼티 지정 가능
interface IUser {
  // 객체의 속성
  name?: string;
  readonly age: number;
  // 객체의 메서드
  greet(): void;
}
let employee: IUser = {
  name: '테드',
  age: 30,
  greet() {
    console.log('Hello');
  },
};

 

2. 인터페이스의 역할

  • 타입 체킹: 개발자가 의도한 대로 코드 작동 가능
  • 코드 가독성 향상
  • 코드 재사용 촉진
  • 확장 가능성 기본 인터페이스를 확장(상속)하여 멤버를 추가하거나 재정의 가능

 

3. 클래스에서 인터페이스 구현

  • 클래스는 implements 키워드를 사용하여 인터페이스를 구현
interface IPerson {
  name: string;
  greet(): void;
}

// Student 클래스 사용 예시
class Student implements IPerson {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  greet(): void {
    console.log(`Hello, my name is ${this.name}`);
  }
}

const student = new Student('테드');
student.greet(); // Hello, my name is 테드

 

4. 확장된 인터페이스

  • extends 키워드를 사용하여 확장
  • 도형을 정의하는 인터페이스
interface Shape {
  color: string;
  lineWidth: number;
}

 

  • 사각형을 정의하는 인터페이스 도형의 인터페이스를 상속받음(Shape이 가진 모든 정의를 가짐)
interface Square extends Shape {
  // color: string;
  // lineWidth: number;
  sideLength: number;
}
  • 공통된 속성을 가진 인터페이스를 여러 번 정의하지 않아도 되기 때문에 코드 중복을 줄임

 

5. 인터페이스(interface) VS 타입 별칭(type)

5-1) 인터페이스

확장 가능성 (Extendability)

  • 여러 다른 인터페이스와 클래스에서 확장 가능
  • 객체 지향 프로그래밍의 상속 개념과 유사

+) 타입 별칭은 '&'연산자를 사용하여 확장 가능

 

병합 선언 (Declaration Merging)

  • 동일한 이름을 가진 인터페이스가 여러 번 선언되면 TypeScript는 이를 하나의 인터페이스로 병합
  • 타입 별칭은 불가능한 기능
interface Shape {
  color: string;
  lineWidth: number;
}
interface Shape {
  name: string;
}
  • 위에 코드는 아래 코드로 병합된다
interface Shape {
  color: string;
  lineWidth: number;
  name: string;
}

 

구조적 타이핑 (Structural Typing)

  • TypeScript는 구조적 타이핑을 사용, 인터페이스는 해당 구조를 만족하는 모든 객체를 타입으로 인정

 

5-2) 타입 별칭

유연성 (Flexibility)

  • 타입 별칭은 객체 타입뿐만 아니라 원시 타입, 유니온 타입, 튜플 등을 포함한 모든 타입을 별칭으로 지정 가능

+) 인터페이스는 객체의 구조만 정의할 수 있기 때문에 원시 타입이나 유니온 타입, 튜플 타입 등을 직접적으로 표현 X

  • 인터페이스는 객체 구조를 정의하는 데 사용됨
  • 원시 타입이나 유니온 타입, 튜플 타입은 인터페이스로 정의할 수 없음
  • 다음과 같은 코드는 불가능
interface Id = number | string; // Error

 

단일 선언 (Single Declaration)

  • 타입 별칭은 단일 선언만 가능, 동일한 이름을 가진 타입을 다시 선언할 수 X
  • 이름 충돌을 방지

리터럴 타입 (Literal Types)

  • 리터럴 타입과 결합하여 특정 값 집합을 타입으로 정의 가능
type Status = 'success' | 'error' | 'loading';
function printStatus(status: Status): void {
  console.log(`Status is ${status}`);
}
printStatus('success'); // Status is success
printStatus('pending'); // Error

 

  • 인터페이스의 한계 예시 - 리터럴 타입을 정의할 수 없음
interface IStatus ='success' | 'error' | 'loading';//Error

 

6. 인터페이스 예시: 확장 가능한 사용자 정보 관리 시스템

interface User {
  id: number;
  name: string;
}

interface Admin extends User {
  permissions: string[]; // 수정 허가, 삭제 허가 등등
}
interface Guest extends User {
  visitDate: Date;
}

const admin1: Admin = {
  id: 1,
  name: '테드',
  permissions: ['update', 'delete'],
};
const guest1: Guest = {
  id: 2,
  name: '테드친구',
  visitDate: new Date(),
};

 

7. 타입 별칭 예시: 복합 타입을 사용하는 API 응답 처리

type ApiResponse = SuccessResponse | ErrorResponse;
type SuccessResponse = {
  status: 'success';
  data: any;
};
type ErrorResponse = {
  status: 'error';
  error: string;
};

const response: ApiResponse = {
  status: 'success',
  data: {
    message: '성공적으로 작동되었습니다',
  },
};

function handleResponse(response: ApiResponse) {
  if (response.status === 'success') {
    console.log('Data:', response.data);
  } else {
    console.log('Error:', response.error);
  }
}

handleResponse(response);
// Data: { message: '성공적으로 작동되었습니다' }

 

 

노션으로 보고 싶다면?

https://short-echidna-b16.notion.site/interface-6268270a598e4e39ac78880957dd5b45?pvs=4

 

인터페이스 (interface) | Notion

목차

short-echidna-b16.notion.site