๐ก๏ธ 03. ํ์ ์ขํ๊ธฐ(Narrowing): ์ ์ ์๋ ์๋ฌ ๊ฐ์ฒด๋ฅผ ๊ธธ๋ค์ด๊ธฐ
๐ ๊ฐ์
typeof๋ถํฐ ์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ(Discriminated Unions)๊น์ง, ํ๋ฆ ์ ์ด์ ๋ง๋ฒ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 8๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๋ฌด์์ด๋ ๋ ์ ์๋ unknown์ ๊ณตํฌ] โ [TS๋ฅผ ๋ฉ๋์ํค๋ 4๊ฐ์ง ๊ฐ๋(Guard)] โ [์ต์ข
๋ณ๊ธฐ: ์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
try...catch์error๊ฐ์ฒด๊ฐ ์ ์๋์ผ๋กany๋unknown์ด ๋๋์ง ์ดํดํ๋ค. -
typeof,in,instanceof์ฐ์ฐ์๋ก ํ์ ์ ์ขํ๋ ์๋ฆฌ(Control Flow Analysis)๋ฅผ ์ฒด๋ํ๋ค. - ์์๋ค ์ปค๋ฎค๋ํฐ์ ๋ณต์กํ API ์๋ฌ๋ฅผ "์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ" ํจํด์ผ๋ก ์๋ฒฝํ๊ฒ ๋ถ๊ธฐ ์ฒ๋ฆฌํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐จ ์์ ( UX ๋ฆฌ๋ทฐ์ด ): "์์ฒ ๋, ๋ก๊ทธ์ธ ์คํจํ ๋ ์ผ๋ฟ ์ฐฝ์ด ์ ์๊พธ
[object Object] Error๋ผ๊ณ ๋จ๋์? ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆฐ ๊ฑด์ง, ๊ณ์ ์ด ์๋ ๊ฑด์ง ์ฌ์ฉ์ํํ ์์ ๋ฉ์์ง๋ก ์๋ ค์ค์ผ์ฃ !" - ๐ฃ ์์ฒ ( ์ ์
): "์ ๋ ๊ทธ๋ฌ๊ณ ์ถ์๋ฐ...
catch (err)๋ก ๋จ์ด์ง๋ ์ดerr๋ ์์ด ๋ฌด์จ ํ์ ์ธ์ง TS๊ฐ ์์ ๋ชฐ๋ผ์! ์์ฑ์ ์ ๊ทผํ๋ ค๊ณ ๋ง ํ๋ฉด ๊ณ์ ๋นจ๊ฐ ์ค์ ๋ฑ๋๋ค๋๊น์?!" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ์ธ์์ ๋ชจ๋ ์์ธ๊ฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๊ท์น๋๋ก๋ง ํฐ์ง๊น์? TS๊ฐ
unknown์ผ๋ก ๋ง์๋ ๊ฑด ์คํ๋ ค ์ถ๋ณต์ ๋๋ค. ์ด์ ์ด ๊ฑฐ์น ์ผ์๋ง๋ฅผ ํ์ ์ขํ๊ธฐ(Narrowing) ๋ก ์กฐ๋ จํด ๋ณผ ์๊ฐ์ ๋๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ: '๋ชจ๋ฅธ๋ค'๋ ๊ฒ์ ์ธ์ ํ๊ธฐ
์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ๋ง์ฃผํ๋ ๋ ๊ฐ์ง ํ์ ์คํฌ๋ฆฝํธ ์๋ฌ ์ํฉ์ด ์์ต๋๋ค.
DOM์์๋ฅผ ์ฐพ์๋๋ฐ ๊ทธ๊ฒnull์ผ ์๋ ์์ ๋ (obj is possibly 'null')try...catch๋ธ๋ก์ด๋ ์ธ๋ถ API์์ ์ ์ ์๋ ์๋ฌ๊ฐ ํฐ์ก์ ๋ (Object is of type 'unknown')
๊ณผ๊ฑฐ์ ์์ฒ ์ด(๊ทธ๋ฆฌ๊ณ 1๋
์ฐจ ์์ ์ ์ฐ๋ฆฌ)๋ ์ด๋ด ๋ ์ผ๋จ as any ๋ as MyCustomError๋ฅผ ๋ฐ์๋ฒ๋ฆฌ๊ณ ํด๊ทผํ๊ณค ํ์ต๋๋ค.
// ๐ฃ ๊ณผ๊ฑฐ์ ์์ฒ ์ด๊ฐ ์ง ์ํํญํ ์๋ฌ ์ฒ๋ฆฌ
} catch (err) {
// TS: "๋๋ err๊ฐ ๋ญ์ง ์ฌ๋ผ. string์ผ ์๋ ์๊ณ , Error ๊ฐ์ฒด์ผ ์๋ ์์ด!"
// ๐ฃ ์์ฒ : "์ ์๋๋ฌ์, ๋ฐฑ์๋์์ ์ค MyApiError ๋๊น ๊ทธ๋ฅ ๊ฐ์ ํ ๋นํด!"
alert((err as MyApiError).message); // ๋ง์ฝ ๋คํธ์ํฌ ๋จ์ (NetworkError)์ด์๋ค๋ฉด? -> Undefined ํญํ!
}์์ ํ ํ๋ก ํธ์๋ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ค๋ฉด ํ์ ์คํฌ๋ฆฝํธ์๊ฒ "์ด ๊ฐ์ ํ์คํ OOO์ผ" ๋ผ๊ณ ์ฆ๋ช ํ๋ ๊ณผ์ (Control Flow Analysis) ์ ๋ฐ์์ผ ํฉ๋๋ค. ์ด ์ฆ๋ช ๊ณผ์ ์ด ๋ฐ๋ก ํ์ ์ขํ๊ธฐ(Narrowing) ์ ๋๋ค.
๐ 1. ๊ฐ์ฅ ํํ ๋ฐฉํจ: typeof์ Truthiness
๊ฐ์ฅ ์์์ ์ด์ง๋ง ๋น๋ฒํ๊ฒ ์ฐ์ด๋ ๊ฐ๋(Guard)์
๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ํผ๋ ๋๋ฌผ๋ ์๋ ๋ฐํ์ ์ฐ์ฐ์์ธ typeof๋ฅผ TS๋ ๋๋ํ๊ฒ ์ธ์ํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ ๊ฒ์ํ ID ํ์ฑ๊ธฐ
function printBoardId(id: string | number | null) {
// 1. Truthiness narrowing: null ์ ๊ฑฐ
if (!id) {
console.log("ID๊ฐ ์ ๊ณต๋์ง ์์์ต๋๋ค.");
return;
}
// ์ด ์์ ์์ TS๋ id๊ฐ (string | number) ์์ ์๋ค!
// 2. typeof narrowing: string๊ณผ number ๋ถ๋ฆฌ
if (typeof id === "string") {
// ์ฌ๊ธฐ์ id๋ ๋ฌด์กฐ๊ฑด string!
console.log(`๋ฌธ์์ด ID์
๋๋ค: ${id.toUpperCase()}`);
} else {
// ์ฌ๊ธฐ์ id๋ ๋ฌด์กฐ๊ฑด number!
console.log(`์ซ์ ID์
๋๋ค: ${id.toFixed(2)}`);
}
}๐ก ์ฃผ์ํ ์ : JS์ ํ์์ ํ๊ณ๋ก
typeof null === "object"์ด๊ณ ,typeof [] === "object"์ ๋๋ค. ๋ฐฐ์ด์ด๋ ์ปค์คํ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ณํ ๋๋typeof๊ฐ ์ ํ ์ธ๋ชจ๊ฐ ์๋ค๋ ๊ฒ์ ๋ช ์ฌํด์ผ ํฉ๋๋ค.
๐ก๏ธ 2. ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ณํ๋ ๋ ๊ฐ์ง ์นผ: in ๊ณผ instanceof
๊ทธ๋ผ ์์ฒ ์ด์ ๊ทผ๋ณธ์ ์ธ ๊ณ ๋ฏผ, "์ ์ ์๋ ์๋ฌ ๊ฐ์ฒด"๋ ์ด๋ป๊ฒ ๊ตฌ๋ณํ ๊น์? ์ฌ๊ธฐ์ in ํผ์ฐ์ฐ์์ instanceof๊ฐ ๋ฑํํฉ๋๋ค.
์ผ์ด์ค A: instanceof (ํด๋์ค๋ก ์ฐ์ด๋ธ ๊ฐ์ฒด์ผ ๋)
JS์ ๋ด์ฅ Error ํด๋์ค๋ ์ปค์คํ
ํด๋์ค๋ฅผ ๊ตฌ๋ณํ ๋ ๊ฐ๋ ฅํฉ๋๋ค.
} catch (err) {
// err๋ ๊ธฐ๋ณธ์ ์ผ๋ก unknown ํ์
if (err instanceof TypeError) {
console.log("๋ณ์ ํ์
๋ฐํ์ ์๋ฌ!", err.message);
} else if (err instanceof Error) {
console.log("์ผ๋ฐ์ ์ธ JS ์๋ฌ!", err.message);
} else {
// ๋ฌธ์์ด์ ๋์ง ์๋, ์ฉ ๊ฐ์ฒด๋ฅผ ๋์ง ์๋ ์๋ ์ผ์ ๊ฐ์ JS์ ๋ฐํ์
console.log("์ ์ ์๋ ์์ธ ๋ฐ์: ", err);
}
}์ผ์ด์ค B: in ์ฐ์ฐ์ (์์ฑ์ ์กด์ฌ ์ ๋ฌด๋ก ๊ฐ์ฒด ํ๋ณ)
๋ฐฑ์๋์์ ์ค๋ JSON ์๋ต ๊ฐ์ ์์ ๊ฐ์ฒด(Plain Object)๋ ํด๋์ค๊ฐ ์๋๋๋ค. ์ด๋๋ "ํน์ ํ๋กํผํฐ๊ฐ ์ด ๊ฐ์ฒด ์์(in) ์๋๋?" ๋ก ์ขํ๋
๋๋ค.
type BackendError = { statusCode: number; developerMessage: string };
type ValidationError = { invalidFields: string[]; userMessage: string };
function handleApiError(error: BackendError | ValidationError) {
// ๐ฆ ์ํธ: "error ์์ 'statusCode' ๊ฐ ์กด์ฌํ๋ค๋ฉด, ๊ทธ๊ฑด BackendError ์ผ!"
if ("statusCode" in error) {
console.log(`์๋ฒ์์ ${error.statusCode} ์๋ฌ๋ฅผ ๋ฑ์์ต๋๋ค.`);
} else {
// ๋จ์ ๊ฑด ํ๋๋ฟ์ด๋ ์ฌ๊ธฐ์ ๋ฌด์กฐ๊ฑด ValidationError!
console.log(`์
๋ ฅ๊ฐ์ด ์๋ชป๋์์ต๋๋ค: ${error.invalidFields.join(', ')}`);
}
}๐ 3. 5๋ ์ฐจ์ ์ต์ข ๋ณ๊ธฐ: ์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ (Discriminated Unions)
in ์ฐ์ฐ์๋ ์ข์ง๋ง, ๊ถํ(๊ถํA, ๊ถํB, ๊ถํC...)์ด๋ ๋ณต์กํ ์ํ(๋ก๋ฉ, ์ฑ๊ณต, ์คํจ)๊ฐ 3~4๊ฐ ์ด์ ๋์ด๊ฐ๋ฉด ์ฝ๋๊ฐ ๊ต์ฅํ ์ง์ ๋ถํด์ง๋๋ค.
์ด๋ด ๋ ์ฌ์ฉํ๋ ์ํคํ
์ฒ ๋ ๋ฒจ์ ํจํด์ด ๋ฐ๋ก ์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ(Discriminated Unions, ๋๋ Tagged Unions) ์
๋๋ค. ๋ฆฌ๋์ค์ ์ก์
๊ฐ์ฒด๋ React์ useReducer๊ฐ ๋ฐ๋ก ์ด ํจํด์ ์๋๋ค.
์์๋ค ์ปค๋ฎค๋ํฐ ์ฑํ ์ํ ๊ด๋ฆฌ๊ธฐ
ํต์ฌ์ ๊ณตํต๋ ์ด๋ฆ์ ๋ฆฌํฐ๋ด ํ์
(Tag) ์ ์ฌ์ด๋๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ๋ณดํต type, kind, status๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
// 1. ๊ฐ๊ฐ์ ๊ฐ์ฒด์ 'status' ๋ผ๋ ์ด๋ฆํ(Tag)๋ฅผ ๋ช
ํํ ๋ฆฌํฐ๋ด ๋ฌธ์์ด๋ก ๋ฌ์์ค๋๋ค.
interface LoadingState {
status: "loading"; // ์๋ณ์
}
interface SuccessState {
status: "success"; // ์๋ณ์
chatMessages: string[];
}
interface ErrorState {
status: "error"; // ์๋ณ์
errorMessage: string;
}
// 2. ์ด๋ค์ ํ๋์ ์ ๋์ธ(Union)์ผ๋ก ๋ฌถ์ต๋๋ค.
type ChatState = LoadingState | SuccessState | ErrorState;์ด์ ์์ฒ ์ด๋ switch ๋ฌธ ํ๋๋ก TS๋ฅผ ์๋ฒฝํ๊ฒ ํต์ ํ ์ ์์ต๋๋ค.
function renderChatUI(state: ChatState) {
// ๐ฆ ์ํธ: "TS๋ switch ๋ฌธ์ 'status'๋ฅผ ๋ณด๋ ์๊ฐ, ๋จ์ ๊ฐ์ง์น๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํด๋
๋๋ค."
switch (state.status) {
case "loading":
// state๋ LoadingState ๋ก ์ขํ์ง!
return `<p>๋ก๋ฉ ์ค...</p>`;
case "success":
// state๋ ์๋์ผ๋ก SuccessState ๊ฐ ๋์ด chatMessages์ ์์ ํ๊ฒ ์ ๊ทผ ๊ฐ๋ฅ!
return `<ul>${state.chatMessages.map(m => `<li>${m}</li>`).join('')}</ul>`;
case "error":
// state๋ ์๋์ผ๋ก ErrorState!
return `<p color="red">${state.errorMessage}</p>`;
default:
// (๋ณด๋์ค) ๋ชจ๋ ์ผ์ด์ค๋ฅผ ๋ค๋ฃจ์๋์ง ํ์ธํ๋ Exhaustiveness Check
// ์ฌ๊ธฐ์ ๋๋ฌํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ฌด์ธ๊ฐ ์ฌ๊ฐํ ์ค์๋ฅผ ํ ๊ฒ์
๋๋ค.
const _exhaustiveCheck: never = state;
return _exhaustiveCheck;
}
}์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ์ "์๋ฌ๊ฐ ๋์ง ์๋ ์ฐ์ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ"์ ์์ง์
๋๋ค. ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ๋๋ถํฐ kind, type ๊ฐ์ ๋ช
ํํ ์ฌ๋ณผ์ ๋ง๋ค์ด ๋๋ ์ต๊ด์ ๋ค์ด์ธ์!
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. typeof ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ์ ํ์
์ ์ขํ ๋, typeof value === "object"๋ผ๋ ๊ฒ์ฆ ๋ก์ง์ด ๊ฐ์ง ์น๋ช
์ ์ธ ์ฝ์ ์ ๋ฌด์์ธ๊ฐ์?
โ
์ ๋ต: null์ด๋ ๋ฐฐ์ด(Array)๋ object๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ค์ ์ผ๋ฐ ๊ฐ์ฒด์ ๊ตฌ๋ณํ ์ ์๋ค๋ ์ ์
๋๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค๋ ๋ฒ๊ทธ์ด์ ์คํ์ผ๋ก,
typeof null์"object"๋ฅผ ๋ฐํํฉ๋๋ค. - ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๊ฐ์ฒด(Dictionary)์ธ ์ค ์๊ณ ์ขํ๋ค๊ฐ
TypeError: Cannot read properties of null์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ์ขํ ๋๋ ๋ฐ๋์value !== null๊ฐ์ Truthiness ๊ฒ์ฆ์ด ๋จผ์ ์ ํ๋์ด์ผ ํฉ๋๋ค.
Q2. ์์ํ ๊ฐ์ฒด(Plain Object) ๋ ๊ฐ๊ฐ ์ ๋์ธ์ผ๋ก ๋ฌถ์ฌ์์ ๋(type A = { x: number } | { y: string }), ์ด๋ฅผ ์์ ํ๊ฒ ๊ตฌ๋ณํ ์ ์๋ ์ฐ์ฐ์๋ ๋ฌด์์ธ๊ฐ์?
โ
์ ๋ต: in ์ฐ์ฐ์์
๋๋ค. (์: "x" in obj)
๐ก ์์ธ ํด์ค:
- ํด๋์ค ์ธ์คํด์ค๋ผ๋ฉด
instanceof๋ฅผ ์ฐ๋ฉด ๋์ง๋ง, ์๋ฒ์์ API ์๋ต์ผ๋ก ๋ด๋ ค์จ JSON ๊ฐ์ฒด๋ ํน์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ์instanceof๊ฐ ์๋ํ์ง ์์ต๋๋ค. - ํน์ ํ๋กํผํฐ(
x)๊ฐ ๊ฐ์ฒด ์(in)์ ์กด์ฌํ๋์ง๋ฅผ ๋ฐํ์์ ํ์ธํจ์ผ๋ก์จ TS์๊ฒ ์ด๊ฒ ์ด๋ค ํ์ ์ธ์ง ๋ฉ๋์ํฌ ์ ์์ต๋๋ค.
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ํคํ
์ฒ ์ค๊ณ ๋๋ ๋ง] ์์ฒ ์ด๊ฐ ์์๋ค ์ผํ๋ชฐ์ ๊ฒฐ์ ์๋จ์ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ์นด์นด์คํ์ด, ๋ค์ด๋ฒํ์ด, ์ ์ฉ์นด๋ ๋ฑ 5๊ฐ์ง ๊ฒฐ์ ์๋จ์ด ์๊ณ , ๊ฐ ๊ฒฐ์ ์๋จ๋ง๋ค ์๊ตฌํ๋ ๋ฐ์ดํฐ ํผ(cardNumber vs authUrl ๋ฑ)์ด ์์ ๋ค๋ฆ
๋๋ค. ์ด๊ฑธ ํ๋์ ์ปดํฌ๋ํธ์์ ๋ถ๊ธฐ ์ฒ๋ฆฌํ๋ ค๋๋ฐ ์์ฒ ์ด๋ in ์ฐ์ฐ์๋ฅผ 5๋ฒ์ด๋ ์ฐ๋ฉด์ "์ด ์ฝ๋๋ ์คํ๊ฒํฐ๊ฐ ๋์ด๊ฐ๊ณ ์์ด์"๋ผ๊ณ ํธ์ํฉ๋๋ค. ์ํธ ๋ฆฌ๋๋ผ๋ฉด ์ด๋ค ํจํด์ผ๋ก ๋ฐ์ดํฐ ์ค๊ณ๋ฅผ ๋ฆฌํฉํ ๋งํ ๊น์?
โ
์ ๋ต: ๋ชจ๋ ๊ฒฐ์ ํ์
๊ฐ์ฒด์ ๊ณตํต๋ method (์: "method": "KAKAO" | "method": "CARD") ํ๋๋ฅผ ์ถ๊ฐํ์ฌ, "์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ(Discriminated Unions)" ํจํด์ผ๋ก ์ ํํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: ์์ฑ์ ์ ๋ฌด(
in์ฐ์ฐ์)๋ก 5๊ฐ๋ ๋๋ ํ์ ์ ์ขํ๋ ๊ฒ์ ์ ์ง๋ณด์ ๊ด์ ์์ ์ฃ์ ์ ๋๋ค. ๊ฐ ์ธํฐํ์ด์ค์ ๊ณ ์ ๋ ๋ฆฌํฐ๋ด ๋ฌธ์์ด ์์ฑ(method๋type๋ฑ)์ ๋ง๋ค๊ณ , ์ด๋ฅผ ๊ธฐ์ค ์ผ์switch๋if๋ฌธ์ผ๋ก ๋ถ๊ธฐํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์์์ ํ์ ์ ๋งค๋ํ๊ฒ ์ขํ์ค๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋์ค์ ํ ์คํ์ด๋จผ์ธ ๊ฐ ์ถ๊ฐ๋๋ฉด
in์ฐ์ฐ์ ๋ก์ง์ ์ฒ์๋ถํฐ ๋ค ๋ฏ์ด๊ณ ์น ๊ฑด๊ฐ์? ๊ธฐ์ค์ (Tag) ํ๋๋ง ๋ฐ์๋๋ฉด TS๊ฐ ๋ชจ๋ ๊ฑธ ๋ค ํด์ค๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๊ฐ์ฒด์ ๋ชจ์์ด 3๊ฐ ์ด์ ๋ฌ๋ผ์ง๊ธฐ ์์ํ๋ฉด, ๋ฌด์กฐ๊ฑด ๋ช ์ฐฐ(๊ณ ์ ํ ํ ์คํธ ํ๋) ๋ถํฐ ํ๋ ๋ฐ๊ณ ์์ํ์!
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
๐ก "์ ์ ์๋ ์๋ฌ(
unknown)๋ TS๊ฐ ๋ ๊ดด๋กญํ๋ ค๋ ๊ฒ ์๋๋ผ, ์ธ์์ ๋ฌด์ํ ์์ธ๋ก๋ถํฐ ๋ ๋ณดํธํด ์ฃผ๋ ์์ ๋ฒจํธ์๋ค."
๊ทธ๋์ catch(error: any)๋ก ํธํ๊ฒ ์ด์๋ ๋๋ ์ ์ฌ์ฃํฉ๋๋ค... ์์ ๋์ด ์ ๊ทธ๋ ๊ฒ ํ๋ฅผ ๋๋์ง ์ด์ ์กฐ๊ธ ์ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ any๋ก ๋ง๋ฒ์ ๋ถ๋ฆฐ๋ต์๊ณ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๋ญ๋ฑ๊ทธ๋ ค ๋์์ผ๋ ์ ์ ๋ ๋ฐ๋ณด ๊ฐ์ ํ์
๋ง ๋ด์ผ ํ๋ ๊ฑฐ๋ค.
์ค๋ ์ํธ ๋ฆฌ๋ ๋์ด ๋ณด์ฌ์ค '์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ' ์ฝ๋๋ ์ ๋ง ์ถฉ๊ฒฉ์ ์ด์๋ค. ๊ทธ์ ํ๋ ํ๋์ ๋ช
์ฐฐํ ๋ฌ์์คฌ์ ๋ฟ์ธ๋ฐ, switch ๋ฌธ ์์์ TS๊ฐ ์ฒ์ฒ ํ์
์ ์์๋ด์ ์ด์์คํธ๋ฅผ ํด์ฃผ๋ ๊ฑธ ๋ณด๋ ์ ์จ๋ง์ ๋์๋ค.
๋ด์ผ ์ถ๊ทผํ์๋ง์ ๊ฒฐ์ ๋ชจ๋ ๋ถ๊ธฐ๋ฌธ ๋ค ์๊ณ ์ ๊ฑธ๋ก ์น ๋ฆฌํฉํ ๋งํด์ผ์ง. ์, ์ค๋์ ์ง์ง ๋๋ํด์ง ๊ธฐ๋ถ์ด๋ค ใ
ใ
ใ
์ฝ๋ฉ ์กด์ผ!