Gwangju-Web-Study / WoowahanTS_Study

✏️우아한 타입스크립트 with 리액트 스터디
6 stars 2 forks source link

2.4.4. type과 interface 키워드의 차이점은 무엇인가요? #11

Closed fe-Jay closed 2 months ago

fe-Jay commented 2 months ago

📝 74p ~ 76p

typeinterface 키워드의 차이점은 무엇인가요?

교재 76p에는 '우형에서는 typeinterface 키워드를 어떻게 사용할까? 라는 스토리가 있습니다. typeinterface의 차이점과 각 키워드를 사용했을 때 장,단점으로는 무엇이 있을까요?


image
hyeonseong2023 commented 2 months ago

type 과 interface의 차이점

1. 확장

// interface : 상속을 통한 확장
interface Animal {
  name: string;
}

interface Bear extends Animal {
  honey: boolean;
}

const bear = getBear();
bear.name;
bear.honey;

// type : 교차 타입 (&)을 통한 유형 확장
type Animal = {
  name: string;
}

type Bear = Animal & { 
  honey: boolean;
}

const bear = getBear();
bear.name;
bear.honey;

2. 추가

// interface : 기존 인터페이스에 새 필드 추가
interface Window {
  title: string;
}

interface Window {
  ts: TypeScriptAPI;
}

// type : 유형은 생성된 후에는 변경 불가
type Window = {
  title: string;
}

type Window = {
  ts: TypeScriptAPI;
}

 // Error: Duplicate identifier 'Window'.

각 기능의 장,단점

type 장점

  1. 교차 타입 (Intersection Types): & 연산자를 사용하여 여러 타입 결합
  2. 조건부 타입 (Conditional Types): 타입 연산에 대한 보다 유연한 접근 가능
  3. 유니언 타입 (Union Types): 여러 가능한 타입 정의

    type 단점

  4. 재선언 불가: 같은 이름의 타입을 여러 번 선언 불가
  5. 추가적인 속성 정의 불가: 선언 후 타입에 추가적인 필드를 추가 불가

interface 장점

선언 병합: 같은 이름의 인터페이스를 여러 번 선언할 수 있으며, 모든 선언 병합 상속: extends 키워드를 사용하여 기존의 인터페이스 확장 가능

interface 단점

제한된 기능: 교차 타입과 같은 고급 타입 연산은 지원 불가 상속 구조의 복잡성: 다중 상속 시 구조가 복잡해질 수 있음

gwangminjun commented 2 months ago

상속

interface

extends 키워드를 이용

interface Person {
  name: string;
  age: number;
}

interface developer extends Person { // 확장(상속)
  language: string;
}

const minjun: developer = {
  name: 'minjun',
  age: 28,
  language: 'java'
}

type

교차 타입(&)을 이용

type Person = {
  name: string,
  age: number
}

type developer = Person & { // 확장(상속)
  language: string
}

const jieun: Student = {
  name: 'jieun',
  age: 27,
  school: 'HY'
}

computed value

interface Grades { [key in Subjects]: string; // ❗️Error: A mapped type may not declare properties or methods. }

### type
computed value 사용 가능
```ts
type Subjects = 'Math' | 'Science' | 'Sociology';

type Grades = {
  [key in Subjects]: string;
}

사용

정해진 컨벤션이 있다면 해당 컨벤션을 사용하고
없다면 각 특징을 파악하여 사용해야할 시점에 특징에 맞게 사용하면 될거같습니다~

reference

Clt689 commented 2 months ago

typeinterface의 차이점

1. 선언 병합(Declaration Merging)

2. 확장 및 구현

3. 표현 가능한 타입

4. 명확한 목적


장점과 단점

interface의 장점👍


type의 장점👍

BaekWeb commented 2 months ago

type 과 interface의 차이점과 각 키워드를 사용했을 때 장,단점으로는 무엇이 있을까요?

interface 의 장점

interface 의 단점

type의 장점

type의 장점

type과 interface의 차이점은? type은 interface에 비해 타입을 정의하는데 자유롭고 복잡한 연산을 지원하지만 복잡해지면서 타입의 정의를 읽기 어려울 수있다는 차이점이있다. 또한 interface의 경우 확장성이 좋은 반면 type의 경우 확장을 하기위해서는 새로운 타입을 정의해야하는 번거로움이 있다.

fe-Jay commented 2 months ago

차이점

TS에서 typeinterface 키워드는 공통적으로 타입을 정의할 때 사용하지만, 몇 가지 중요한 차이점이 존재함.

  interface type
확장성
Extensibillity
1. extends 키워드를 사용하여 타입 확장 가능.
2. 선언 병합이 가능하여, 동일한 이름의 interface 선언시 자동 병합됨.
1. 교차타입 & 을 사용하여 타입 확장 가능.
2. 선언 병합 불가능. 동일한 이름의 타입 재선언 불가.
표현력
Expressiveness
1. 객체 리터럴 타입(class)을 정의하는데 주로 사용2. 함수, 클래스 등도 정의할 수 있지만, 복잡한 타입 표현에 제한 있음. 1. 모든 종류의 타입 정의 (union intersection tuple …)
2. 조건부, 매핑된 타입 등 고급 타입기능 사용 가능.
계산된 속성
Computed Properties
계산된 속성 이름 사용 불가능. 계산된 속성 이름 직접 사용 가능.
성능 타입 검사시 더 빠를 수 있음.(ex. 복잡한 타입 계층) 복잡한 타입 연산을 수행할 때 컴파일 시간이 더 소요될 수 있음.
사용사례 1. 객체의 구조를 정의할 때 주로 사용.
2. 라이브러리나 API를 설계할 때 선호(선언병합이 가능하기 때문)
1. 모든 종류 타입의 별칭을 정의할 때 사용.
2. 복잡한 타입 로직이 필요한 경우 선호.

각 키워드의 장단점 및 권장사항

  1. 팀 내에서 일관된 타입 스타일을 유지하는 것이 중요함. 한 프로젝트 내에서는 가능한 interface type 중 한 가지 방식을 주로 사용하는 것을 권장함.
  2. 외부에 공개되는 API를 개발할 때는 interface 를 사용하는 것이 유연한 확장성을 제공함.
  3. 복잡한 타입 연산이 필요한 경우 type 을 사용하는 것이 더 적합함.
  4. 대규모 프로젝트에서는 interface 가 성능면에서 다소 유리할 수 있음.

코드 비교

  // 1. API 응답 타입 정의 (interface 사용)
  interface User {
    id: number;
    name: string;
    email: string;
  }

  interface ApiResponse { // 응답형태와 같은 객체형태 정의
    data: User[];
    meta: {
      total: number;
      page: number;
      perPage: number;
    };
  }

  // API 응답을 처리하는 함수
  function processApiResponse(response: ApiResponse) {
    response.data.forEach(user => {
      console.log(`${user.name} has email ${user.email}`);
    });
    console.log(`Total users: ${response.meta.total}`);
  }

  // 2. 복잡한 타입 정의 (type 사용)
  type Status = 'pending' | 'processing' | 'completed' | 'failed';

  type Job<T> = {
    id: number;
    status: Status;
    data: T; // 제네릭 타입
    createdAt: Date;
    completedAt?: Date;
  };

  function processJob<T>(job: Job<T>) { // 제네릭 타입(Job<T>)
    console.log(`Processing job ${job.id} with status ${job.status}`);
  }