Optional Chaining
선택적 체이닝(Optional chaining)이
TC39 3단계에서 합의점에 도달한 내용이 TS 3.7 입니다.
선택적 체이닝을 사용하면 null 또는 undefined인 코드에 도달했을 때
즉시 중지할 수 있는 코드를 작성할 수 있습니다.
프로퍼티 접근 (Property Access)
우리가 아티스트와 아티스트 약력이 없는
앨범을 가지고 있다고 가정해 보겠습니다.
예를 들면, 컴필레이션 앨범에는 아티스트 정보가 없습니다.
// 선택적 체이닝을 사용하면
다음과 같은 코드를 작성할 수 있습니다:
type AlbumAPIResponse = {
title: string;
artist?: {
name: string;
bio?: string;
previousAlbums?: string[];
};
};
declare const album: AlbumAPIResponse;
// 이 경우 ?.는 &&과는 다르게 동작합니다.
왜냐하면 &&는 "falsy" 값에 대한 동작이 다르기 때문입니다.
(예. 빈 문자열, 0, NaN, 그리고, false)
선택적 체이닝은 null이거나 undefined이면
동작을 멈추고, undefined를 반환합니다.
선택적 요소 접근 (Optional Element Access)
프로퍼티 접근은 .연산자만을 이용하고,
선택적 체이닝이 요소에 접근할 때는 []연산자와 함께 이용합니다.
const artistBio = album?.artist?.bio;
// 대신에:
const maybeArtistBio = album.artist && album.artist.bio;
// 런타임 시 존재 여부를 판단하는 함수를 다룰 때,
선택적 체이닝은 실제로 존재하는 경우에만 함수호출을 지원합니다.
이는 if (func) func()와 같은
기존에 사용하던 코드를 대체할 수 있습니다.
예를 들어 API 요청에 의한 콜백 함수의 선택적 호출은
다음과 같습니다:
const maybeArtistBioElement = album?.["artist"]?.["bio"];
const maybeFirstPreviousAlbum = album?.artist?.previousAlbums?.[0];
// 선택적 호출(Optional Calls)
// 선택적 체이닝에 대한 자세한 내용은 3.7 블로그 게시물을 통해 확인할 수 있습니다:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/
const callUpdateMetadata = (metadata: any) => Promise.resolve(metadata); // 가짜 API 호출
const updateAlbumMetadata = async (metadata: any, callback?: () => void) => {
await callUpdateMetadata(metadata);
callback?.();
};