1. 덕 타이핑(duck typing) / 구조적 서브타이핑 (structural subtyping)
타입 검사가 값의 형태에 초점을 맞추고 있다
2. 인터페이스 (interface)
- 실제로는 더 많은 프로퍼티를 갖고 있어도 컴파일러는 최소한 필요한 프로퍼티가 있는지와 타입이 잘 맞는지만 검사한다.
- 타입 검사는 프로퍼티들의 순서를 요구하지 않습니다. 단지 인터페이스가 요구하는 프로퍼티들이 존재하는지와 프로퍼티들이 요구하는 타입을 가졌는지만을 확인합니다.
3. 선택적 프로퍼티(optional properties)
- 선택적 프로퍼티는 선언에서 프로퍼티 이름 끝에 ?를 붙여 표시합니다.
4. 읽기전용 프로퍼티(readonly properties)
5. 초과 프로퍼티 검사 (excess property checks)
6. 함수 타입(function types)
- 인터페이스에 호출 서명 (call signature)를 전달합니다. 이는 매개변수 목록과 반환 타입만 주어진 함수 선언과 비슷합니다. 각 매개변수는 이름과 타입이 모두 필요합니다.
7. 인덱서블 타입 (indexable types)
- 인덱싱 할때 해당 반환 유형과 함께 객체를 인덱싱하는 데 사용할 수 있는 타입을 기술하는 인덱스 시그니처 (index signature)를 가지고 있다.
유니언 타입
유니언 타입은 여러 타입 중 하나가 될 수 있는 값을 의미합니다. 세로 막대 (|)로 각 타입을 구분하여, number | string | boolean은 값의 타입이 number, string 혹은 boolean이 될 수 있음을 의미합니다.
공통 필드를 갖는 유니언 (unions with common fields)
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
declare function getSmallPet(): Fish | Bird;
let pet = getSmallPet();
pet.layEggs();
// 두 개의 잠재적인 타입 중 하나에서만 사용할 수 있습니다.
pet.swim();
유니언 구별하기 (discriminating union)
type NetworkLoadingState = {
state: "loading";
};
type NetworkFailedState = {
state: "failed";
code: number;
};
type NetworkSuccessState = {
state: "success";
response: {
title: string;
duration: number;
summary: string;
};
};
// ---생략---
type NetworkState =
| NetworkLoadingState
| NetworkFailedState
| NetworkSuccessState;
function networkStatus(state: NetworkState): string {
// 현재 TypeScript는 셋 중 어떤 것이
// state가 될 수 있는 잠재적인 타입인지 알 수 없습니다.
// 모든 타입에 공유되지 않는 프로퍼티에 접근하려는 시도는
// 오류를 발생시킵니다.
state.code;
// state에 swtich문을 사용하여, TypeScript는 코드 흐름을 분석하면서
// 유니언 타입을 좁혀나갈 수 있습니다.
switch (state.state) {
case "loading":
return "Downloading...";
case "failed":
// 여기서 타입은 NetworkFailedState일 것이며,
// 따라서 `code` 필드에 접근할 수 있습니다.
return `Error ${state.code} downloading`;
case "success":
return `Downloaded ${state.response.title} - ${state.response.summary}`;
}
}
교차 타입 (intersection types)
- 여러 타입을 하나로 결합한다.
interface ErrorHandling {
success: boolean;
error?: { message: string };
}
interface ArtworksData {
artworks: { title: string }[];
}
interface ArtistsData {
artists: { name: string }[];
}
// 이 인터페이스들은
// 하나의 에러 핸들링과 자체 데이터로 구성됩니다.
type ArtworksResponse = ArtworksData & ErrorHandling;
type ArtistsResponse = ArtistsData & ErrorHandling;
const handleArtistsResponse = (response: ArtistsResponse) => {
if (response.error) {
console.error(response.error.message);
return;
}
console.log(response.artists);
};
교차를 통한 믹스인 (Mixins via Intersections)
'Typescript' 카테고리의 다른 글
Typescript 기초 문법 3 (0) | 2024.05.25 |
---|---|
Typescript 기초 문법 - 인터페이스 (2) | 2024.05.09 |
Typescript 기초 문법 (1) | 2024.05.08 |
type- record (0) | 2024.03.06 |
벨로퍼트 Typescript 정리 (2) | 2023.08.25 |