|
| 1 | +//// { compiler: { }, order: 1 } |
| 2 | + |
| 3 | +// 선택적 체이닝(Optional chaining)이 TC39 3단계에서 합의점에 도달했습니다. |
| 4 | +// 그것이 TS 3.7 내용입니다. 선택적 체이닝을 사용하면 |
| 5 | +// null 또는 undefined인 코드에 도달했을 때 |
| 6 | +// 즉시 중지할 수 있는 코드를 작성할 수 있습니다. |
| 7 | + |
| 8 | +// 프로퍼티 접근(Property Access) |
| 9 | + |
| 10 | +// 우리가 아티스트와 아티스트 약력이 없는 |
| 11 | +// 앨범을 가지고 있다고 가정해 보겠습니다. 예를 들면, |
| 12 | +// 컴필레이션 앨범에는 아티스트 정보가 없습니다. |
| 13 | + |
| 14 | +type AlbumAPIResponse = { |
| 15 | + title: string; |
| 16 | + artist?: { |
| 17 | + name: string; |
| 18 | + bio?: string; |
| 19 | + previousAlbums?: string[]; |
| 20 | + }; |
| 21 | +}; |
| 22 | + |
| 23 | +declare const album: AlbumAPIResponse; |
| 24 | + |
| 25 | +// 선택적 체이닝을 사용하면, |
| 26 | +// 다음과 같은 코드를 작성할 수 있습니다: |
| 27 | + |
| 28 | +const artistBio = album?.artist?.bio; |
| 29 | + |
| 30 | +// 대신에: |
| 31 | + |
| 32 | +const maybeArtistBio = album.artist && album.artist.bio; |
| 33 | + |
| 34 | +// 이 경우 ?.는 &&과는 다르게 동작합니다. 왜냐하면, |
| 35 | +// &&는 "falsy"값에 대한 동작이 다르기 때문입니다. |
| 36 | +// (예. 빈 문자열, 0, NaN, 그리고, false). |
| 37 | + |
| 38 | +// 선택적 체이닝은 null이거나, 연산을 멈추고 undefined를 반환하는 |
| 39 | +// 신호로 사용됩니다. |
| 40 | + |
| 41 | +// 선택적 요소 접근(Optional Element Access) |
| 42 | + |
| 43 | +// 프로퍼티 접근은 .연산자만을 이용하고, |
| 44 | +// 선택적 체이닝이 요소에 접근할 때는 []연산자와 함께 이용합니다. |
| 45 | + |
| 46 | +const maybeArtistBioElement = album?.["artist"]?.["bio"]; |
| 47 | + |
| 48 | +const maybeFirstPreviousAlbum = album?.artist?.previousAlbums?.[0]; |
| 49 | + |
| 50 | +// 선택적 호출(Optional Calls) |
| 51 | + |
| 52 | +// 런타임 시 존재 여부를 판단하는 함수를 다룰 때, |
| 53 | +// 선택적 체이닝은 실제로 존재하는 경우에만 함수호출을 지원합니다. |
| 54 | +// 이는 if (func) func()과 같은 기존에 사용하던 코드를 |
| 55 | +// 대체할 수 있습니다. |
| 56 | + |
| 57 | +// 예를 들어 API 요청에 의한 콜백 함수의 선택적 호출은 |
| 58 | +// 다음과 같습니다: |
| 59 | + |
| 60 | +const callUpdateMetadata = (metadata: any) => Promise.resolve(metadata); // Fake API call |
| 61 | + |
| 62 | +const updateAlbumMetadata = async (metadata: any, callback?: () => void) => { |
| 63 | + await callUpdateMetadata(metadata); |
| 64 | + |
| 65 | + callback?.(); |
| 66 | +}; |
| 67 | + |
| 68 | +// 선택적 체이닝에 대한 자세한 내용은 3.7 블로그 게시물을 통해 확인할 수 있습니다: |
| 69 | +// |
| 70 | +// https://devblogs.microsoft.com/typescript/announcing-typescript-3-7/ |
0 commit comments