Closed fe-Jay closed 2 months ago
// 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;
// interface : 기존 인터페이스에 새 필드 추가
interface Window {
title: string;
}
interface Window {
ts: TypeScriptAPI;
}
// type : 유형은 생성된 후에는 변경 불가
type Window = {
title: string;
}
type Window = {
ts: TypeScriptAPI;
}
// Error: Duplicate identifier 'Window'.
선언 병합: 같은 이름의 인터페이스를 여러 번 선언할 수 있으며, 모든 선언 병합 상속: extends 키워드를 사용하여 기존의 인터페이스 확장 가능
제한된 기능: 교차 타입과 같은 고급 타입 연산은 지원 불가 상속 구조의 복잡성: 다중 상속 시 구조가 복잡해질 수 있음
extends 키워드를 이용
interface Person {
name: string;
age: number;
}
interface developer extends Person { // 확장(상속)
language: string;
}
const minjun: developer = {
name: 'minjun',
age: 28,
language: 'java'
}
교차 타입(&)을 이용
type Person = {
name: string,
age: number
}
type developer = Person & { // 확장(상속)
language: string
}
const jieun: Student = {
name: 'jieun',
age: 27,
school: 'HY'
}
computed value 사용 불가
type Subjects = 'math' | 'science' | 'sociology';
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;
}
정해진 컨벤션이 있다면 해당 컨벤션을 사용하고
없다면 각 특징을 파악하여 사용해야할 시점에 특징에 맞게 사용하면 될거같습니다~
type
과 interface
의 차이점
type 과 interface의 차이점과 각 키워드를 사용했을 때 장,단점으로는 무엇이 있을까요?
interface 의 장점
interface 의 단점
type의 장점
type의 장점
type과 interface의 차이점은? type은 interface에 비해 타입을 정의하는데 자유롭고 복잡한 연산을 지원하지만 복잡해지면서 타입의 정의를 읽기 어려울 수있다는 차이점이있다. 또한 interface의 경우 확장성이 좋은 반면 type의 경우 확장을 하기위해서는 새로운 타입을 정의해야하는 번거로움이 있다.
TS에서 type
과 interface
키워드는 공통적으로 타입을 정의할 때 사용하지만, 몇 가지 중요한 차이점이 존재함.
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. 복잡한 타입 로직이 필요한 경우 선호. |
interface
type
중 한 가지 방식을 주로 사용하는 것을 권장함.interface
를 사용하는 것이 유연한 확장성을 제공함.type
을 사용하는 것이 더 적합함.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}`);
}
📝 74p ~ 76p
❓
type
과interface
키워드의 차이점은 무엇인가요?교재 76p에는 '우형에서는
type
과interface
키워드를 어떻게 사용할까? 라는 스토리가 있습니다.type
과interface
의 차이점과 각 키워드를 사용했을 때 장,단점으로는 무엇이 있을까요?