728x90
반응형
가끔, number
나 string
을 매개변수로 기대하는 라이브러리를 사용할 때가 있습니다.
function padLeft(value: string, padding: any) {
if (typeof padding === "number") {
return Array(padding + 1).join(" ") + value;
}
if (typeof padding === "string") {
return padding + value;
}
throw new Error(`Expected string or number, got '${padding}'.`);
}
padLeft("Hello world", 4); // "Hello world"를 반환합니다.
위 예제에서 padding
이 number나 string이 아닌 인수로 함수를 호출할 수 있다는 의미입니다. 유니언 타입은 이러한 상황에서 여러 타입 중 하나가 될 수 있는 값을 의미합니다. 세로막대( | )로 각 타입을 구분합니다.
function padLeft(value: string, padding: string | number) {
// ...
}
let indentedString = padLeft("Hello world", true);
공통 필드를 갖는 유니언
유니언 타입인 값이 있으면, 모든 타입에 공통인 멤버들에만 접근할 수 있습니다.
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
declare function getSmallPet(): Fish | Bird;
let pet = getSmallPet();
pet.layEggs();
// 두 개의 잠재적인 타입 중 하나에서만 사용할 수 있습니다.
pet.swim();
유니언 구별하기
유니언을 사용하는데 있어서 타입 추론의 범위를 좁혀나가게 해줄 수 있는 리터럴 타입을 갖는 단일 필드를 사용하는 것입니다.
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}`;
}
}
위 타입들은 모두 state
라는 필드를 갖고 있으며, 그들 각자만의 필드도 갖고 있습니다:
NetworkLoadingState | NetworkFailedState | NetworkSuccessState |
state | state | state |
code | response |
state
필드가 NetworkState
안의 모든 타입에 공통으로 존재한다는 점을 안다면 - 존재 여부를 체크하지 않고도 접근할 수 있습니다.
리터럴 타입으로서 state
를 갖고 있다면, state
의 값은 대응하는 동일한 문자열과 대조되고 TypeScript는 현재 어떤 타입이 사용되고 있는지 알 것입니다.
NetworkLoadingState | NetworkFailedState | NetworkSuccessState |
"loading" | "failed" | "success" |
이 경우, 런타임에 나타나는 타입의 범위를 좁히기 위하여 switch
문을 사용할 수 있습니다.
728x90
반응형
'프론트엔드 스터디 > Typescript' 카테고리의 다른 글
[TypeScript] 기초 - 제네릭(Generic) (0) | 2021.07.21 |
---|---|
[TypeScript] 기초 - 교차 타입(Intersection Type) (0) | 2021.07.21 |
[TypeScript] 기초 - 리터럴 타입 (0) | 2021.07.20 |
[TypeScript] 기초 - 인터페이스(Interface) (0) | 2021.07.20 |
[TypeScript]기초 - 기본 타입 (0) | 2021.07.20 |