Skip to content

Commit 6958ae8

Browse files
Merge pull request #1077 from ss-won/issue910/translate-ko
translate Async Await.ts, Optional Chaining.ts to ko
2 parents 26fac7f + b6e0e66 commit 6958ae8

File tree

3 files changed

+180
-1
lines changed

3 files changed

+180
-1
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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+
// 동작을 멈추고, undefined를 반환합니다.
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/
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
//// { order: 1, target: "es5" }
2+
3+
// 모던 JavaScript는 특별한 구문의
4+
// 프로미스(Promise) 기반 API를 추가하여
5+
// 비동기 코드가 동기적으로 작동하는 것처럼
6+
// 콜백을 처리하는 방법을 추가했습니다.
7+
8+
// 모든 언어 기능과 마찬가지로, 이러한 방식은 복잡성이 증가하는 대신 효율성이
9+
// 증가합니다: 함수를 async로 만드는 것은 반환값을 프로미스 형태로
10+
// 감싸주는 것을 의미합니다. 기존에는 string을 반환했지만
11+
// 이제 Promise<string>을 반환합니다.
12+
13+
const func = () => ":wave:";
14+
const asyncFunc = async () => ":wave:";
15+
16+
const myString = func();
17+
const myPromiseString = asyncFunc();
18+
19+
myString.length;
20+
21+
// myPromiseString은 string이 아닌 프로미스 입니다:
22+
23+
myPromiseString.length;
24+
25+
// await 키워드를 사용하면 프로미스를 내부의 값으로 변환할 수 있습니다.
26+
// 현재, 이러한 기능은 async 함수 내에서만
27+
// 작동합니다.
28+
29+
const myWrapperFunction = async () => {
30+
const myString = func();
31+
const myResolvedPromiseString = await asyncFunc();
32+
33+
// await 키워드를 통해, 이제 myResolvedPromiseString
34+
// 값은 문자열입니다.
35+
myString.length;
36+
myResolvedPromiseString.length;
37+
};
38+
39+
// await을 통해 실행되는 코드는 오류 객체를 발생시킬 수 있고,
40+
// 이러한 오류를 잡아내는 것이 중요합니다.
41+
42+
const myThrowingFunction = async () => {
43+
throw new Error("Do not call this");
44+
};
45+
46+
// async 함수를 try catch 문으로 감싸
47+
// 함수가 예기치 않게 작동하는 경우를 처리합니다.
48+
49+
const asyncFunctionCatching = async () => {
50+
const myReturnValue = "Hello world";
51+
try {
52+
await myThrowingFunction();
53+
} catch (error) {
54+
console.error("myThrowingFunction failed", error);
55+
}
56+
return myReturnValue;
57+
};
58+
59+
// 단일 값을 반환하거나 오류를 발생시키는
60+
// API의 인간 공학적 특성 때문에,
61+
// 반환 값 내부의 결괏값에 대한 정보 제공을 고려해야 하며,
62+
// 실제 예외적인 상황이 발생했을 때만
63+
// throw 문을 사용해야 합니다.
64+
65+
const exampleSquareRootFunction = async (input: any) => {
66+
if (isNaN(input)) {
67+
throw new Error("Only numbers are accepted");
68+
}
69+
70+
if (input < 0) {
71+
return { success: false, message: "Cannot square root negative number" };
72+
} else {
73+
return { success: true, value: Math.sqrt(input) };
74+
}
75+
};
76+
77+
// 그런 다음 해당 비동기 함수를 받는 객체로 응답 상태를 확인하고
78+
// 반환 값으로 무엇을 처리할지 알아냅니다.
79+
// 이것은 사소한 예제지만, 네트워킹 코드를 작업을 시작하면
80+
// 이러한 API는 구문은 추가할만한 가치가 있습니다.
81+
82+
const checkSquareRoot = async (value: number) => {
83+
const response = await exampleSquareRootFunction(value);
84+
if (response.success) {
85+
response.value;
86+
}
87+
};
88+
89+
// Async/Await 구문은 다음과 같은 코드를 사용해왔습니다:
90+
91+
// getResponse(url, (response) => {
92+
// getResponse(response.url, (secondResponse) => {
93+
// const responseData = secondResponse.data
94+
// getResponse(responseData.url, (thirdResponse) => {
95+
// ...
96+
// })
97+
// })
98+
// })
99+
100+
// 이를 순차적으로 작성하면:
101+
102+
// const response = await getResponse(url)
103+
// const secondResponse = await getResponse(response.url)
104+
// const responseData = secondResponse.data
105+
// const thirdResponse = await getResponse(responseData.url)
106+
// ...
107+
108+
// 코드가 왼쪽 가장자리에 가깝게 배치되어,
109+
// 코드가 일관된 리듬으로 읽힐 수 있습니다.

packages/playground-examples/copy/ko/sections.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,4 @@
5959
"New TS Features",
6060
"New Checks"
6161
]
62-
}
62+
}

0 commit comments

Comments
 (0)