๐ก๏ธ 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์๋ค๋ฉด message๊ฐ ์์ด์ ์ฌ์ฉ์ ์๋ด๊ฐ ๊นจ์ง ์ ์์
}์์ ํ ํ๋ก ํธ์๋ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ค๋ฉด ํ์ ์คํฌ๋ฆฝํธ์๊ฒ "์ด ๊ฐ์ ํ์คํ 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 ํ๋๋ฅผ ์ถ๊ฐํ๊ณ , ์๋ณ ๊ฐ๋ฅํ ์ ๋์ธ(Discriminated Unions)์ผ๋ก ์ ํํ๋ค.
๐ก ์์ธ ํด์ค:
- ์์ฑ์ ์ ๋ฌด(
in์ฐ์ฐ์)๋ง์ผ๋ก 5๊ฐ ํ์ ์ ๊ตฌ๋ถํ๋ฉด ์ ๊ฒฐ์ ์๋จ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ์กฐ๊ฑด๋ฌธ์ด ํ๋ค๋ฆฝ๋๋ค. - ๊ฐ ํ์
์
method: "KAKAO" | "NAVER" | "CARD"๊ฐ์ ๊ณ ์ ๋ฆฌํฐ๋ด ํ๋๋ฅผ ๋๊ณswitch (payment.method)๋ก ๋ถ๊ธฐํ๋ฉด, TS๊ฐ ๊ฐ ์ผ์ด์ค์์ ํ์ํ ํ๋๋ฅผ ์ ํํ ์ขํ์ค๋๋ค. - ๊ฐ์ฒด์ ๋ชจ์์ด ์ฌ๋ฌ ๊ฐ๋๋ก ๋๋๊ธฐ ์์ํ๋ฉด, ๋จผ์ ๊ณตํต ์๋ณ์(Tag)๋ฅผ ์ค๊ณํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ์ ๋ฆฌํฉ๋๋ค.
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ unknown์ด ๊ท์ฐฎ์ ๋นจ๊ฐ ์ค์ด ์๋๋ผ ์์ ํ ์ถ๋ฐ์ ์ด๋ผ๋ ๊ฑธ ๋ฐฐ์ ๋ค. ์์ธ๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํด๋์ค๋ง ๋์ง๋ ๊ฒ ์๋๊ณ , ๋คํธ์ํฌ ๋ฌธ์ ๋ ๋ธ๋ผ์ฐ์ API์ฒ๋ผ ์ ํ ๋ค๋ฅธ ๋ชจ์์ผ๋ก๋ ๋ค์ด์จ๋ค.
์์ ๋์ด ๋งํ "[object Object]" ํ์
๋ ๊ฒฐ๊ตญ ๋ด๊ฐ ์๋ฌ๋ฅผ ์ขํ์ง ์๊ณ ๋์ถฉ ๋ฌธ์์ด๋ก ๋ฐ์ด๋ธ ๊ฒฐ๊ณผ์๋ค. typeof, in, instanceof๋ก ํ์ธํ ๋ค ์ฌ์ฉ์ ๋ฉ์์ง์ ๊ฐ๋ฐ์ ๋ก๊ทธ๋ฅผ ๋๋๋ฉด UX๋ ๋๋ฒ๊น
๋ ๊ฐ์ด ์ข์์ง๋ค.
๐ก "
unknown์ ๋งํ ๊ธธ์ด ์๋๋ผ ํ์ธํ๊ณ ์ง๋๊ฐ๋ผ๋ ํ์งํ์ด๋ค. ์ขํ ๋ค์ ์ ๊ทผํ๋ฉด ํ์ ๋ ์ฌ์ฉ์ ๋ฉ์์ง๋ ํจ๊ป ์ ๋ช ํด์ง๋ค."
๊ฒฐ์ ์๋จ ๋ถ๊ธฐ์๋ method ํ๋๋ฅผ ๋จผ์ ์ถ๊ฐํด๋ณด๋ ค๊ณ ํ๋ค. ์กฐ๊ฑด๋ฌธ์ ๋๋ฆฌ๋ ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์๋ณ์๋ฅผ ์ฌ์ผ๋ฉด, ๋ค์ ๊ฒฐ์ ์๋จ์ด ๋ค์ด์๋ ๋ฆฌ๋ทฐ์์ ํ์ธํ ์ง์ ์ด ํจ์ฌ ๋ถ๋ช
ํด์ง ๊ฒ ๊ฐ๋ค.