728x90
type과 interface는 타입스트립트에서 값의 타입을 지정하는 방법들이다.
interface 형
객체 구조를 정의할 때 사용되며 객체와 클래스의 타입을 정의할 때 사용된다.
interface는 상속(extends)을 이용한 확장이 가능하며 다중 상속을 지원한다.
interface Point {
x: number;
y: number;
}
interface Named {
name: string;
}
interface Person extends Named {
age: number;
}
또한 이전 글에서 정리했듯이 interface에서 인덱스 시그니처를 이용하려면 명시적으로 선언해줘야 사용이 가능하다.
export interface selectedStateInterface {
position: {
duelist: boolean,
recon: boolean,
sentinels: boolean,
controllers: boolean,
noDicision: boolean,
[key: string]: boolean,
},
operator: ImgInterface[]
}
type 형
객체 구조를 정의할 때 사용할 수 있지만, 객체 구조보다 단순한 원시값과 튜플, 유니언 타입을 선언할 때 사용
type Point = {
x: number;
y: number;
};
type ID = string | number;
type Callback = (data: string) => void;
type은 암묵적인 인덱스 시그니처를 갖는다.
type Subjects = 'Math' | 'Science' | 'Sociology';
type Grades = {
[key in Subjects]: string;
}
그래서 type과 interface 뭐가 더 좋은데?
사실 과거에는 interface 방식이 선호되었다.
그 이유는 Typescript 컴파일러가 interface를 정의할 때, interface를 메모리에 캐싱하여 재사용할 수 있도록 해서이다.
하지만! 현재의 Typescript는 지속적인 개선과 컴파일러의 최적화 작업이 이루어져 type과 interface의 성능차이가 거의 없어졌다.
1. 효율적인 타입 체크
타입 체크와 관련된 여러 최적화 작업을 수행하여 복잡한 타입 체크를 더 효율적으로 처리한다.
- 타입 간소화: 타입을 단순화하여 빠른 수행 속도를 보장하도록 한다.
동일한 타입 표현식을 여러 번 계산하지 않고, 이전에 계산한 결과를 재사용한다. - 타입 인덱싱: 타입 시스템이 넓고 복잡한 코드베이스에서 여러 타입을 인덱싱하고 캐시해 빠른 접근이 가능하게 한다.
- 선형 시간 타입 연산: 타입 연산을 선형 시간으로 처리하는 알고리즘을 사용해 성능저하 없는 타입 체크를 수행
2. 향상된 캐싱 메커니즘
Typescript의 컴파일러는 캐싱 전략을 통해 컴파일 성능을 향상시킨다.
- 타입 결과 캐싱: 특정 타입 연산 결과를 캐싱해 반복되는 계산을 다시 하지 않고 캐시된 결과를 사용
- 모듈 캐싱: 모듈간 의존성을 분석해 변경되지 않은 모듈의 결과를 캐싱하여 변경된 모듈만 다시 컴파일한다. 이를 통해 전체 컴파일 시간을 줄일 수 있다.
3. 타입 병합 최적화
Typescript는 유니언 타입이나 인터섹션 타입과 같은 복잡한 타입을 처리하는 알고리즘의 최적화를 진행했다.
UnionType: 자바스크립트의 or(||) 연산자와 비슷하게 A 또는 B 같은 의미를 갖는다. => text: string | number
IntersectionType: 여러 타입을 만족하는 하나의 타입을 의미 => interface Person{ name: string; age: number; }
- 중복 제거: 타입 병합 과정에서 중복된 타입을 제거해 최종 타입을 간소화한다.
=> 동일한 타입이 여러 번 포함된 유니언 타입을 단일 타입으로 축소한다. - 지연 평가: 타입 병합 연신을 지연 평가해 필요한 시점에만 타입 병합을 수행한다. => 불필요한 타입 병합 연산을 방지
728x90
'TypeScript' 카테고리의 다른 글
에러) element implicitly has an 'any' type because expression of type 'string' can't be used to index type (1) | 2024.02.08 |
---|---|
TypeScript 속성 학습 - 3 (0) | 2023.01.27 |
TypeScript 속성 학습 - 2 (1) | 2023.01.26 |
TypeScript 속성 학습 - 1 (1) | 2023.01.24 |