타입스크립트 핸드북 5장 - 유니언과 교차 타입
Contents
https://typescript-kr.github.io/pages/unions-and-intersections.html
Union Types
any
를 사용하기 보단 예상되는 타입의 개수를 줄인다
function padLeft(value: string, padding: string | number) {
// ...
}
let indentedString = padLeft("Hello world", true);
|
로 타입을 구분number | string | boolean
은 값 타입이number
,string
,boolean
중 하나가 될 수 있음을 의미
Unions with Common Fields
유니언 타입을 사용할 때에는 유니언으로 연결된 모든 타입에 공통으로 존재하는 값에만 접근 가능
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
위 예제에서는 Bird | Fish
유니언 타입이 있을 때 공통으로 존재하는 멥버인 layEggs()
에만 접근 가능
Discriminating Unions
컴파일러가 type narrowing에 도움이 되도록 리터럴 타입을 가지는 단일 필드를 사용하자
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;
- 위 예시에서 각 타입에 따라 그외 다른 필드도 가지고 있음
- 하지만
state
필드는 모든 타입에 존재- 때문에 필드 유무 검사 없이 컴파일러는
NetworkState
유니온 타입에state
필드가 존재함을 알 수 있음 - 이렇게 사용했을 때 런타임에 switch 문 등을 사용해서 유니언 타입의 타입을 더 좁혀 나갈 수 있다
- 때문에 필드 유무 검사 없이 컴파일러는
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);
};
- 위 예시에서는 각 인터페이스를 교차타입으로 결합
- 교차 타입을 사용함으로써 추가적인 boilerplate 코드 없이 해당 멤버를 참조 가능
Interface Segregation Principle
- SOLID 원칙 의 I (ISP)
- 인터페이스는 가능한 적은 양의 메서드를 가지고 있어야 한다
- 인터페이스를 구현하는 concrete 클래스는 반드시 인터페이스의 모든 메서드를 구현해야 하기 때문
Intersection Types in Java
https://dev.to/rnowif/intersection-types-in-java-1jk8
자바에서는 제네릭과 결합해서 다음과 같이 사용 가능
<T extends FileReader & FileWriter> void readAndWrite(T file) {
file.readLines();
file.write("Hello");
}
- 비슷하게 여러 인터페이스를 교차한 인터페이스가 필요할 때 사용