๐ก๏ธ ํ์ ๊ฐ๋: ๋ฐํ์์ ํ์ ํ์ธํ๊ธฐ ๐ต๏ธโโ๏ธ

์๋ , ์น๊ตฌ๋ค! ์ค๋์ TypeScript์ ๊ฟํ ์ค ํ๋์ธ 'ํ์ ๊ฐ๋'์ ๋ํด ์ฌ๋ฐ๊ฒ ์๊ธฐํด๋ณผ ๊ฑฐ์ผ. ํ์ ๊ฐ๋๋ผ๋, ๋ญ๊ฐ ๋ฉ์ง ๊ฒฝํธ์์ด ํ์ ์ ์ง์ผ์ฃผ๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋ค์ง ์์? ๐ ์ฌ์ค ๊ทธ๋ ๊ฒ ๋ฉ์ง ์์ ๊ฐ๋ ์ด์ผ. ํ์ ๊ฐ๋๋ ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ์์ ํ๊ฒ ์ง์ผ์ฃผ๋ ๋ ๋ ํ ์น๊ตฌ๋ผ๊ณ ํ ์ ์์ง.
๐ ํต์ฌ ํฌ์ธํธ: ํ์ ๊ฐ๋๋ ๋ฐํ์์ ๋ณ์์ ํ์ ์ ํ์ธํ๊ณ , ํน์ ์ค์ฝํ ๋ด์์ ๊ทธ ํ์ ์ ๋ณด์ฅํด์ฃผ๋ ๊ธฐ๋ฅ์ด์ผ.
์, ์ด์ ๋ถํฐ ํ์ ๊ฐ๋์ ์ธ๊ณ๋ก ๋น ์ ธ๋ณผ๊น? ์ฐ๋ฆฌ์ ์ฌ์ ์ ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ํํํ๋ ๊ฒ์ฒ๋ผ ํฅ๋ฏธ์ง์งํ ๊ฑฐ์ผ. ๊ทธ๋ผ ์ถ๋ฐ~! ๐
๐ค ํ์ ๊ฐ๋๊ฐ ํ์ํ ์ด์
TypeScript๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ์ด๋ฐ ์ํฉ์ ์์ฃผ ๋ง์ฃผ์น๊ฒ ๋ผ. ์ฌ๋ฌ ํ์ ์ ๊ฐ์ง ์ ์๋ ๋ณ์๊ฐ ์๋๋ฐ, ํน์ ๋์์ ์ํํ๋ ค๋ฉด ๊ทธ ๋ณ์์ ์ ํํ ํ์ ์ ์์์ผ ํ๋ ๊ฒฝ์ฐ ๋ง์ด์ผ. ์ด๋ด ๋ ํ์ ๊ฐ๋๊ฐ ๋ฑ์ฅํ๋ ๊ฑฐ์ง!
๐ ๋ฌธ์ ์ํฉ: ๋ฌธ์์ด์ด๋ ์ซ์๋ฅผ ๋ฐ์ ์ ์๋ ํจ์๊ฐ ์๋ค๊ณ ์๊ฐํด๋ด. ๋ฌธ์์ด์ด๋ฉด ๋๋ฌธ์๋ก ๋ณํํ๊ณ , ์ซ์๋ฉด ์ ๊ณฑ์ ํด์ผ ํ๋ค๋ฉด?
์ด๋ฐ ์ํฉ์์ ํ์ ๊ฐ๋ ์์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ด๋ ๊ฒ ๋ ๊ฑฐ์ผ:
function processValue(value: string | number) {
// ์๋ฌ! 'value'๊ฐ 'string'์ธ์ง ํ์คํ์ง ์์
// value.toUpperCase();
// ์๋ฌ! 'value'๊ฐ 'number'์ธ์ง ํ์คํ์ง ์์
// value * value;
}
์... ์ด๊ฑด ์ข ๊ณค๋ํ๋ค. TypeScript ์ปดํ์ผ๋ฌ๊ฐ "์ผ, ๊ทธ๊ฑฐ ์์ ํ์ง ์์!"๋ผ๊ณ ์๋ฆฌ์น๋ ๊ฑธ ๋ค์ ์ ์์ ๊ฑฐ์ผ. ๐
์ด๋ด ๋ ํ์ ๊ฐ๋๊ฐ ์ฐ๋ฆฌ์ ๊ตฌ์์๋ก ๋ฑ์ฅํ๋ ๊ฑฐ์ง! ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ํ์ํ ์ฌ๋ฅ์ ์ ํํ ์ฐพ์๋ด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ๐
๐ก ํ์ ๊ฐ๋์ ์ญํ : ๋ฐํ์์ ํ์ ์ ํ์ธํ๊ณ , TypeScript์๊ฒ "์ด ๋ธ๋ก ์์์๋ ์ด ๋ณ์๊ฐ ํ์คํ ์ด ํ์ ์ด์ผ!"๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฑฐ์ผ.
์, ์ด์ ํ์ ๊ฐ๋์ ํ์์ฑ์ ์์์ผ๋, ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์์ธํ ์์๋ณผ๊น? ์ค๋น๋์ด? ๋ค์ ์น์ ์์ ๊ณ์! ๐โโ๏ธ๐จ
๐ ๏ธ ํ์ ๊ฐ๋์ ์ข ๋ฅ
ํ์ ๊ฐ๋์๋ ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ๋ง๋ ์ ์๋ ๊ฒ์ฒ๋ผ, ํ์ ๊ฐ๋๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์์ง. ์, ํ๋์ฉ ์ดํด๋ณผ๊น?
1. typeof ํ์ ๊ฐ๋ ๐
typeof
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ํ์
๊ฐ๋์ผ. ๊ธฐ๋ณธ ํ์
์ ์ฒดํฌํ ๋ ์ฃผ๋ก ์ฌ์ฉํด.
function processValue(value: string | number) {
if (typeof value === "string") {
// ์ฌ๊ธฐ์๋ value๊ฐ ํ์คํ string ํ์
์ด์ผ
return value.toUpperCase();
} else {
// ์ฌ๊ธฐ์๋ value๊ฐ ํ์คํ number ํ์
์ด์ผ
return value * value;
}
}
์! ์ด์ ์๋ฌ ์์ด ๊น๋ํ๊ฒ ๋์ํ๋ ๊ฑธ ๋ณผ ์ ์์ด. typeof๋ฅผ ์ฌ์ฉํ๋ฉด TypeScript๋ ๊ฐ ๋ธ๋ก ์์์ value์ ํ์ ์ ์ ํํ ์ ์ ์๊ฒ ๋ผ. coolํ์ง? ๐
2. instanceof ํ์ ๊ฐ๋ ๐ญ
instanceof
์ฐ์ฐ์๋ ๊ฐ์ฒด๊ฐ ํน์ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง ํ์ธํ ๋ ์ฌ์ฉํด.
class Cat {
meow() {
console.log("์ผ์น~");
}
}
class Dog {
bark() {
console.log("๋ฉ๋ฉ!");
}
}
function makeSound(animal: Cat | Dog) {
if (animal instanceof Cat) {
animal.meow(); // OK!
} else {
animal.bark(); // OK!
}
}
instanceof๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ํ์ ์ ์ ํํ ์ ์ ์์ด. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ๋๋ฌผ์ด ์ ๋๋ก ๋ ์๋ฆฌ๋ฅผ ๋ผ ์ ์๊ฒ ๋๋ ๊ฑฐ์ง. ๐ฑ๐ถ
3. in ์ฐ์ฐ์ ํ์ ๊ฐ๋ ๐
in
์ฐ์ฐ์๋ ๊ฐ์ฒด์ ํน์ ํ๋กํผํฐ๊ฐ ์๋์ง ํ์ธํ ๋ ์ฌ์ฉํด.
interface Bird {
fly(): void;
}
interface Fish {
swim(): void;
}
function move(pet: Bird | Fish) {
if ("fly" in pet) {
pet.fly(); // OK!
} else {
pet.swim(); // OK!
}
}
in ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด๊ฐ ํน์ ํ๋กํผํฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ ์ ์์ด. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ์ ์ฝ๋๋ ๋์ฑ ์์ ํ๊ณ ์์ธก ๊ฐ๋ฅํด์ง์ง. ๐
๐ ํ: ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์์ ์ฑ์ด ๋์์ ธ. ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ฒ์ฆ๋ ์ ๋ฌธ๊ฐ์ ์ฌ๋ฅ์ ์ ํํ๋ ๊ฒ์ฒ๋ผ, ํ์ ๊ฐ๋๋ ์ฐ๋ฆฌ ์ฝ๋์ ํ์ง์ ๋ณด์ฅํด์ฃผ๋ ๊ฑฐ์ผ!
์, ์ด์ ๊ธฐ๋ณธ์ ์ธ ํ์ ๊ฐ๋๋ค์ ์์๋ดค์ด. ํ์ง๋ง ์ด๊ฒ ๋ค๊ฐ ์๋์ผ! ๋ ๋ฉ์ง ํ์ ๊ฐ๋ ๊ธฐ๋ฒ๋ค์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์ง. ๊ณ์ํด์ ์์๋ณผ๊น? ๐
๐ญ ์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋
์, ์ด์ ์ข ๋ ๊ณ ๊ธ์ค๋ฌ์ด ๊ธฐ์ ๋ก ๋์ด๊ฐ๋ณผ๊น? ๋ฐ๋ก '์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋'์ผ. ์ด๋ฆ๋ถํฐ ๋ฉ์ง์ง ์์? ๐
์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ง๋๋ ํน๋ณํ ํจ์์ผ. ์ด ํจ์๋ boolean์ ๋ฐํํ๊ณ , ๋ฐํ ํ์ ์ ํน๋ณํ ํํ์ ํ์ ์ ์ด(type predicate)๋ฅผ ์ฌ์ฉํด.
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
function move(pet: Fish | Bird) {
if (isFish(pet)) {
pet.swim(); // OK!
} else {
pet.fly(); // OK!
}
}
์ฌ๊ธฐ์ pet is Fish
๊ฐ ๋ฐ๋ก ํ์
์ ์ด์ผ. ์ด ํจ์๊ฐ true๋ฅผ ๋ฐํํ๋ฉด, TypeScript๋ ํด๋น ๋ณ์๊ฐ Fish ํ์
์ด๋ผ๊ณ ์ธ์ํ๊ฒ ๋ผ.
๐ก ์ ์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋๋ฅผ ์ธ๊น? ๋ณต์กํ ํ์ ์ฒดํฌ ๋ก์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ๋ง๋ค ์ ์์ด. ์ฝ๋๊ฐ ๋ ๊น๋ํด์ง๊ณ ๊ฐ๋ ์ฑ๋ ์ข์์ง์ง!
์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋๋ ์ ๋ง ๊ฐ๋ ฅํด. ๋ง์น ์ฌ๋ฅ๋ท์์ ์์ ๋ง์ ํน๋ณํ ์ฌ๋ฅ์ ์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๋ ํ๋ก์ ํธ์ ๋ง๋ ์ปค์คํ ํ์ ์ฒดํฌ ๋ก์ง์ ๋ง๋ค ์ ์๋ ๊ฑฐ์ง.
๐จ ์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋ ํ์ฉ ์์
์ข ๋ ์ค์ฉ์ ์ธ ์์๋ฅผ ๋ค์ด๋ณผ๊น? API ์๋ต์ ์ฒ๋ฆฌํ๋ ์ํฉ์ ์๊ฐํด๋ณด์.
interface SuccessResponse {
status: 'success';
data: any;
}
interface ErrorResponse {
status: 'error';
message: string;
}
type ApiResponse = SuccessResponse | ErrorResponse;
function isSuccessResponse(response: ApiResponse): response is SuccessResponse {
return response.status === 'success';
}
function handleApiResponse(response: ApiResponse) {
if (isSuccessResponse(response)) {
console.log('์ฑ๊ณต:', response.data);
} else {
console.error('์๋ฌ:', response.message);
}
}
์ด๋ ๊ฒ ํ๋ฉด API ์๋ต์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ด. ์ฑ๊ณต ์๋ต๊ณผ ์๋ฌ ์๋ต์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ๊ณ , ๊ฐ๊ฐ์ ๋ง๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ง.
์ฌ์ฉ์ ์ ์ ํ์ ๊ฐ๋๋ ์ ๋ง ์ ์ฉํด. ํนํ ๋ณต์กํ ๊ฐ์ฒด ๊ตฌ์กฐ๋ Union ํ์ ์ ๋ค๋ฃฐ ๋ ์ง๊ฐ๋ฅผ ๋ฐํํ๋ค๊ณ . ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ์ ์ฝ๋๋ ์ ๋ฌธ์ ์ด๊ณ ์์ ํด์ง๋ ๊ฑฐ์ผ.
๐ ํ๋ก ํ: ์ฌ์ฉ์ ์ ์ ํ์
๊ฐ๋๋ฅผ ๋ง๋ค ๋๋ ํจ์ ์ด๋ฆ์ is
๋ก ์์ํ๋ ๊ฒ์ด ๊ด๋ก์ผ. ์๋ฅผ ๋ค๋ฉด isString
, isNumber
๊ฐ์ ์์ด์ง. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๋ ์ด ํจ์๊ฐ ํ์
๊ฐ๋๋ผ๋ ๊ฑธ ์ฝ๊ฒ ์ ์ ์์ด!
์, ์ด์ ํ์ ๊ฐ๋์ ์ธ๊ณ์ ๊น์ด ๋น ์ ธ๋ค์์ง? ํ์ง๋ง ์์ง ๋์ด ์๋์ผ! ๋ ํฅ๋ฏธ๋ก์ด ๋ด์ฉ์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์์ด. ๋ค์ ์น์ ์์ ๊ณ์ ์์๋ณด์๊ณ ! ๐
๐งฉ ํ์ ๊ฐ๋์ Union ํ์
Union ํ์ ๊ณผ ํ์ ๊ฐ๋๋ ์ฐฐ๋ก๊ถํฉ์ด์ผ! ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ์กฐํฉํด ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ฒ๋ผ, Union ํ์ ๊ณผ ํ์ ๊ฐ๋๋ฅผ ์ ํ์ฉํ๋ฉด ์ ๋ง ๊ฐ๋ ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด.
๐ Union ํ์ ๋ณต์ต
Union ํ์ ์ ์ฌ๋ฌ ํ์ ์ค ํ๋์ผ ์ ์๋ ๊ฐ์ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ด์ผ. ์๋ฅผ ๋ค์ด:
type StringOrNumber = string | number;
์ด ํ์ ์ ๋ณ์๋ ๋ฌธ์์ด์ด๊ฑฐ๋ ์ซ์์ผ ์ ์์ด. ๊ทผ๋ฐ ์ด๋ฐ Union ํ์ ์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์์ด.
โ ๏ธ ์ฃผ์์ : Union ํ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋๋ ๋ชจ๋ ๊ฐ๋ฅํ ํ์ ์ ๊ณตํต๋ ์์ฑ์ด๋ ๋ฉ์๋๋ง ์ง์ ์ ๊ทผํ ์ ์์ด.
์ด๋ด ๋ ํ์ ๊ฐ๋๊ฐ ๋ฑ์ฅํ๋ ๊ฑฐ์ผ! ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ํ์ ์๋ง ์๋ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ง.
๐ก๏ธ Union ํ์ ๊ณผ ํ์ ๊ฐ๋ ํ์ฉํ๊ธฐ
์ค์ ์์ ๋ฅผ ํตํด ์ดํด๋ณผ๊น?
type Shape = Circle | Rectangle | Triangle;
interface Circle {
kind: "circle";
radius: number;
}
interface Rectangle {
kind: "rectangle";
width: number;
height: number;
}
interface Triangle {
kind: "triangle";
base: number;
height: number;
}
function calculateArea(shape: Shape): number {
switch (shape.kind) {
case "circle":
return Math.PI * shape.radius ** 2;
case "rectangle":
return shape.width * shape.height;
case "triangle":
return 0.5 * shape.base * shape.height;
}
}
์ฌ๊ธฐ์ shape.kind
๋ฅผ ์ฒดํฌํ๋ ๊ฒ์ด ๋ฐ๋ก ํ์
๊ฐ๋ ์ญํ ์ ํ๊ณ ์์ด. TypeScript๋ ๊ฐ case ๋ธ๋ก ์์์ shape์ ์ ํํ ํ์
์ ์ ์ ์๊ฒ ๋๋ ๊ฑฐ์ง.
์ด๋ฐ ๋ฐฉ์์ '์๋ณ ๊ฐ๋ฅํ Union(Discriminated Union)'์ด๋ผ๊ณ ๋ถ๋ฌ. ๊ฐ ํ์ ๋ง๋ค ๊ณตํต๋ ์์ฑ(์ฌ๊ธฐ์๋ 'kind')์ ๋๊ณ , ์ด๋ฅผ ํตํด ํ์ ์ ๊ตฌ๋ถํ๋ ๊ฑฐ์ผ.
๐ก ํ: ์๋ณ ๊ฐ๋ฅํ Union์ ์ฌ์ฉํ๋ฉด ์ฝ๋์ ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ด ํฌ๊ฒ ํฅ์๋ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ฐ ๋ถ์ผ์ ์ ๋ฌธ๊ฐ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๊ณ ๊ทธ๋ค์ ์ฌ๋ฅ์ ์ต๋ํ ํ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์!
๐ญ ํ์ ๊ฐ๋์ ์ ๋ค๋ฆญ
์ ๋ค๋ฆญ๊ณผ ํ์ ๊ฐ๋๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ฑ ๊ฐ๋ ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด. ํ๋ฒ ๋ณผ๊น?
function isArray<T>(value: T | T[]): value is T[] {
return Array.isArray(value);
}
function processValues<T>(value: T | T[]) {
if (isArray(value)) {
// ์ฌ๊ธฐ์ value๋ T[] ํ์
value.forEach(item => console.log(item));
} else {
// ์ฌ๊ธฐ์ value๋ T ํ์
console.log(value);
}
}
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ํ์ ์ด๋ ๋จ์ผ ๊ฐ์ธ์ง ๋ฐฐ์ด์ธ์ง ์์ ํ๊ฒ ๊ตฌ๋ถํ ์ ์์ด. ์ ๋ค๋ฆญ์ ์ ์ฐ์ฑ๊ณผ ํ์ ๊ฐ๋์ ์์ ์ฑ์ด ๋ง๋ ์ ๋ง ๋ฉ์ง ์ฝ๋๊ฐ ํ์ํ ๊ฑฐ์ง!
ํ์ ๊ฐ๋์ Union ํ์ , ๊ทธ๋ฆฌ๊ณ ์ ๋ค๋ฆญ์ ์ ํ์ฉํ๋ฉด, ์ ๋ง ๋ค์ฌ๋ค๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฐ์ง ์ฌ๋๋ค์ด ๋ชจ์ฌ ๋ฉ์ง ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ๐
์, ์ด์ ํ์ ๊ฐ๋์ ์ธ๊ณ์ ๊น์ด ๋น ์ ธ๋ค์์ง? ํ์ง๋ง ์์ง ๋ ์ฌ๋ฏธ์๋ ๋ด์ฉ์ด ๋จ์์์ด. ๋ค์ ์น์ ์์ ๊ณ์ ์์๋ณด์๊ณ ! ๐
๐ญ ๊ณ ๊ธ ํ์ ๊ฐ๋ ํ ํฌ๋
์, ์ด์ ํ์ ๊ฐ๋์ ๊ณ ๊ธ ๊ธฐ์ ์ ๋ฐฐ์๋ณผ ์๊ฐ์ด์ผ! ๐ ์ด ๊ธฐ์ ๋ค์ ๋ง์คํฐํ๋ฉด ๋์ TypeScript ์ค๋ ฅ์ ํ์ธต ๋ ์ ๊ทธ๋ ์ด๋๋ ๊ฑฐ์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ณ ๊ธ ๊ธฐ์ ์ ๊ฐ์ง ์ ๋ฌธ๊ฐ์ฒ๋ผ ๋ง์ด์ง! ๐
1. ํ์ ๊ฐ๋์ ํ์ ๋จ์ธ(Type Assertion) ์กฐํฉํ๊ธฐ
๋๋ก๋ ํ์ ๊ฐ๋๋ง์ผ๋ก๋ ๋ถ์กฑํ ๋๊ฐ ์์ด. ์ด๋ด ๋ ํ์ ๋จ์ธ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ ๊ฐ๋ ฅํด์ง ์ ์์ง.
interface Cat {
meow(): void;
}
interface Dog {
bark(): void;
}
function makeNoise(animal: Cat | Dog) {
if ('meow' in animal) {
(animal as Cat).meow();
} else {
(animal as Dog).bark();
}
}
์ฌ๊ธฐ์ as
ํค์๋๋ฅผ ์ฌ์ฉํ ๋ถ๋ถ์ด ๋ฐ๋ก ํ์
๋จ์ธ์ด์ผ. ํ์
๊ฐ๋๋ก ํ์ธํ ํ์ ํ์
๋จ์ธ์ ์ฌ์ฉํ๋ฉด, ์ปดํ์ผ๋ฌ์๊ฒ "๋ฏฟ์ด, ๋ ์ด๊ฑฐ ํ์คํด!"๋ผ๊ณ ๋งํ๋ ๊ฑฐ์ง.
โ ๏ธ ์ฃผ์: ํ์ ๋จ์ธ์ ๊ฐ๋ ฅํ์ง๋ง, ๋จ์ฉํ๋ฉด ์ํํ ์ ์์ด. ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ ์ข์!
2. ํ์ ๊ฐ๋์ ์ ๋ค๋ฆญ ์ ์ฝ์กฐ๊ฑด(Generic Constraints) ํ์ฉํ๊ธฐ
์ ๋ค๋ฆญ๊ณผ ํ์ ๊ฐ๋๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋, ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ฉด ๋ ์ ๊ตํ ํ์ ์ฒดํฌ๊ฐ ๊ฐ๋ฅํด์ ธ.
interface Lengthwise {
length: number;
}
function logLength<T extends Lengthwise>(value: T) {
console.log(value.length);
}
function ensureArray<T>(value: T | T[]): T[] {
if (Array.isArray(value)) {
return value;
} else {
return [value];
}
}
// ์ฌ์ฉ ์
logLength("Hello"); // OK
logLength([1, 2, 3]); // OK
// logLength(123); // Error: number doesn't have a length property
const result = ensureArray("Hello"); // Type: string[]
console.log(result.length); // OK
์ฌ๊ธฐ์ <T extends Lengthwise>
๋ ์ ๋ค๋ฆญ ์ ์ฝ์กฐ๊ฑด์ด์ผ. ์ด๋ ๊ฒ ํ๋ฉด length
์์ฑ์ด ์๋ ํ์
๋ง ํ์ฉํ๊ฒ ๋ผ. ํ์
๊ฐ๋์ ๊ฒฐํฉํ๋ฉด ๋์ฑ ์์ ํ๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ง!
3. ์กฐ๊ฑด๋ถ ํ์ (Conditional Types)๊ณผ ํ์ ๊ฐ๋
์กฐ๊ฑด๋ถ ํ์ ์ ์ฌ์ฉํ๋ฉด ๋ ๋ณต์กํ ํ์ ๋ก์ง์ ๊ตฌํํ ์ ์์ด. ํ์ ๊ฐ๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ ๋ง ๊ฐ๋ ฅํด์ ธ!
type TypeName<T> =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" :
"object";
function getTypeName<T>(value: T): TypeName<T> {
if (typeof value === "string") return "string";
if (typeof value === "number") return "number";
if (typeof value === "boolean") return "boolean";
if (typeof value === "undefined") return "undefined";
if (typeof value === "function") return "function";
return "object";
}
// ์ฌ์ฉ ์
const stringType = getTypeName("hello"); // Type: "string"
const numberType = getTypeName(123); // Type: "number"
const objectType = getTypeName({}); // Type: "object"
์ด ์์ ์์ TypeName
์ ์กฐ๊ฑด๋ถ ํ์
์ด๊ณ , getTypeName
ํจ์๋ ํ์
๊ฐ๋๋ฅผ ์ฌ์ฉํด. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐํ์์ ํ์
์ ์ ํํ ํ๋ณํ๋ฉด์๋, ์ปดํ์ผ ํ์์ ์ ํํ ํ์
์ ๋ณด๋ฅผ ์ป์ ์ ์์ง.
๐ก ํ๋ก ํ: ์กฐ๊ฑด๋ถ ํ์ ๊ณผ ํ์ ๊ฐ๋๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด, ํ์ ์์คํ ์ ํํ๋ ฅ์ ๊ทน๋ํํ ์ ์์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ฌ๋ฌ ์ ๋ฌธ๊ฐ์ ์ฌ๋ฅ์ ์กฐํฉํด ๋ณต์กํ ํ๋ก์ ํธ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ!
์ด๋ฐ ๊ณ ๊ธ ๊ธฐ์ ๋ค์ ๋ง์คํฐํ๋ฉด, ๋์ TypeScript ์ฝ๋๋ ๋์ฑ ์์ ํ๊ณ , ์ ์ฐํ๊ณ , ํํ๋ ฅ ์๊ฒ ๋ ๊ฑฐ์ผ. ํ์ ๊ฐ๋๋ ๋จ์ํ ํ์ ์ ์ฒดํฌํ๋ ๊ฒ์ ๋์ด์, ์ฝ๋์ ๋ก์ง๊ณผ ํ๋ฆ์ ๋ ๋ช ํํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ผ๋ ๊ฑธ ๊ธฐ์ตํด!
์, ์ด์ ํ์ ๊ฐ๋์ ๊ณ ๊ธ ์ธ๊ณ๋ฅผ ํํํด๋ดค์ด. ์ด๋, ์ฌ๋ฏธ์์ง? ๐ข ํ์ง๋ง ์์ง ๋์ด ์๋์ผ! ๋ค์ ์น์ ์์๋ ์ค์ ํ๋ก์ ํธ์์ ํ์ ๊ฐ๋๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ๋ ์์ธํ ์์๋ณผ ๊ฑฐ์ผ. ์ค๋น๋๋? ๊ฐ์ฆ์~! ๐
๐ ์ค์ ์์์ ํ์
๊ฐ๋ ํ์ฉ
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ํ์ ๊ฐ๋๋ฅผ ์ค์ ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์์๋ณผ ์ฐจ๋ก์ผ! ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ฐฐ์ด ๊ธฐ์ ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ๐
1. API ์๋ต ์ฒ๋ฆฌํ๊ธฐ
์น ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด API ์๋ต์ ์ฒ๋ฆฌํด์ผ ํ ์ผ์ด ์ ๋ง ๋ง์ง? ์ด๋ ํ์ ๊ฐ๋๋ฅผ ํ์ฉํ๋ฉด ์์ฃผ ์ ์ฉํด!
interface SuccessResponse {
status: 'success';
data: any;
}
interface ErrorResponse {
status: 'error';
message: string;
}
type ApiResponse = SuccessResponse | ErrorResponse;
function handleApiResponse(response: ApiResponse) {
if (response.status === 'success') {
// ์ฌ๊ธฐ์ response๋ SuccessResponse ํ์
console.log('๋ฐ์ดํฐ:', response.data);
} else {
// ์ฌ๊ธฐ์ response๋ ErrorResponse ํ์
console.error('์๋ฌ:', response.message);
}
}
// ์ฌ์ฉ ์
const successResponse: ApiResponse = { status: 'success', data: { name: 'John' } };
const errorResponse: ApiResponse = { status: 'error', message: '์๋ฒ ์๋ฌ' };
handleApiResponse(successResponse);
handleApiResponse(errorResponse);
์ด๋ ๊ฒ ํ๋ฉด API ์๋ต์ ํ์ ์ ๋ฐ๋ผ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ด. ํ์ ์์ ์ฑ๋ ํ๋ณด๋๊ณ , ์ฝ๋๋ ๊น๋ํด์ง์ง!
2. ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์์ ํ์ฉ
๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ํ์ ๊ฐ๋๋ฅผ ํ์ฉํด ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ๋ ์์ ํ๊ฒ ํ ์ ์์ด.
interface LoadingState {
status: 'loading';
}
interface SuccessState {
status: 'success';
data: string[];
}
interface ErrorState {
status: 'error';
error: string;
}
type State = LoadingState | SuccessState | ErrorState;
function MyComponent({ state }: { state: State }) {
if (state.status === 'loading') {
return <div>๋ก๋ฉ ์ค...</div>;
} else if (state.status === 'success') {
return (
<ul>
{state.data.map(item => <li key={item}>{item}</li>)}
</ul>
);
} else {
return <div>์๋ฌ: {state.error}</div>;
}
}
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์ํ์ ๋ฐ๋ฅธ UI๋ฅผ ํ์ ์์ ํ๊ฒ ๋ ๋๋งํ ์ ์์ด. ์ค์๋ก ์๋ชป๋ ์์ฑ์ ์ ๊ทผํ๋ ์ผ์ด ์์ด์ง์ง!
3. ์ด๋ฒคํธ ํธ๋ค๋ง
๋ค์ํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ํ์ ๊ฐ๋๊ฐ ์ ์ฉํด. ํนํ ์ฌ๋ฌ ์ข ๋ฅ์ ์ด๋ฒคํธ๋ฅผ ํ๋์ ํธ๋ค๋ฌ๋ก ์ฒ๋ฆฌํ ๋ ๋ง์ด์ผ.
function handleEvent(event: MouseEvent | KeyboardEvent) {
if (event instanceof MouseEvent) {
console.log(`๋ง์ฐ์ค ์์น: (${event.clientX}, ${event.clientY})`);
} else {
console.log(`๋๋ฆฐ ํค: ${event.key}`);
}
}
// ์ฌ์ฉ ์
document.addEventListener('click', handleEvent);
document.addEventListener('keydown', handleEvent);
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฒคํธ์ ํ์ ์ ๋ฐ๋ผ ์ ์ ํ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ด. ์ฝ๋๋ ๊น๋ํ๊ณ ํ์ ์์ ์ฑ๋ ํ๋ณด๋์ง!
๐ก ํ๋ก ํ: ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์ ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ปค๋ฒํ๊ณ ์๋์ง ํ์ธํด. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์์ด!
์ด๋ ๊ฒ ์ค์ ์์ ํ์ ๊ฐ๋๋ฅผ ํ์ฉํ๋ฉด, ์ฝ๋์ ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ด ํฌ๊ฒ ํฅ์๋ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ์ ํ๋ก์ ํธ์ ํ์ง์ ๋์ด๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ!
์, ์ด์ ํ์ ๊ฐ๋์ ์ค์ ํ์ฉ๋ฒ๊น์ง ๋ฐฐ์ ์ด. ์ด๋, ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ ์ฌ๋ฏธ์์ด ๋ณด์ด์ง ์์? ๐ ํ์ง๋ง ์์ง ์ฐ๋ฆฌ์ ์ฌ์ ์ ๋๋์ง ์์์ด. ๋ค์ ์น์ ์์๋ ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค์ ๋ํด ์์๋ณผ ๊ฑฐ์ผ. ์ค๋น๋๋? ๊ฐ์ฆ์~! ๐
โ ๏ธ ํ์ ๊ฐ๋ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
ํ์ ๊ฐ๋๋ ์ ๋ง ์ ์ฉํ ๋๊ตฌ์ง๋ง, ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค์ด ์์ด. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ์กฐ์ธ์ ๋ฐ์ ๋ ์ฃผ์ ๊น๊ฒ ๋ค์ด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ. ์, ์ด๋ค ์ ๋ค์ ์กฐ์ฌํด์ผ ํ ์ง ์์๋ณผ๊น?
1. ๊ณผ๋ํ ์ฌ์ฉ ์ฃผ์
ํ์ ๊ฐ๋๋ ๊ฐ๋ ฅํ์ง๋ง, ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ด.
// ์ข์ง ์์ ์
function processValue(value: string | number | boolean | object) {
if (typeof value === 'string') {
// string ์ฒ๋ฆฌ
} else if (typeof value === 'number') {
// number ์ฒ๋ฆฌ
} else if (typeof value === 'boolean') {
// boolean ์ฒ๋ฆฌ
} else {
// object ์ฒ๋ฆฌ
}
}
// ๋ ๋์ ๋ฐฉ๋ฒ
type ValueType = 'string' | 'number' | 'boolean' | 'object';
function processValue(value: any, type: ValueType) {
switch (type) {
case 'string':
// string ์ฒ๋ฆฌ
break;
case 'number':
// number ์ฒ๋ฆฌ
break;
// ... ๊ธฐํ ์ผ์ด์ค
}
}
ํ์ ๊ฐ๋๋ฅผ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ด. ๊ฐ๋ฅํ๋ฉด ํ์ ์ ๋จ์ํํ๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด๋ด.
2. ๋ถ์ ํํ ํ์ ๊ฐ๋
ํ์ ๊ฐ๋๊ฐ ๋ชจ๋ ์ผ์ด์ค๋ฅผ ์ ํํ ์ปค๋ฒํ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ด.
function isArray(value: any): value is any[] {
return Array.isArray(value);
}
function processItems(items: string | string[]) {
if (isArray(items)) {
items.forEach(item => console.log(item.toUpperCase()));
} else {
console.log(items.toUpperCase());
}
}
// ๋ฌธ์ ๋ฐ์!
processItems([1, 2, 3] as any); // ๋ฐํ์ ์๋ฌ: 1.toUpperCase is not a function
์ด ์์ ์์ isArray
ํ์
๊ฐ๋๋ ๋ฐฐ์ด์ ์์ ํ์
์ ์ฒดํฌํ์ง ์์. ๊ทธ๋์ ์ซ์ ๋ฐฐ์ด์ ๋ฃ์ผ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํด.
3. ๋ถ์์ฉ์ด ์๋ ํ์ ๊ฐ๋
ํ์ ๊ฐ๋ ํจ์์ ๋ถ์์ฉ์ด ์์ผ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ด.
let count = 0;
function isString(value: any): value is string {
count++; // ๋ถ์์ฉ!
return typeof value === 'string';
}
function processValue(value: string | number) {
if (isString(value)) {
console.log(value.toUpperCase());
} else {
console.log(value.toFixed(2));
}
}
processValue('hello');
console.log(count); // 1
processValue(42);
console.log(count); // 2
ํ์ ๊ฐ๋ ํจ์์ ๋ถ์์ฉ์ด ์์ผ๋ฉด, ํ์ ์ฒดํฌ๋ง ํ๋ ค๊ณ ํด๋ ์์์น ๋ชปํ ์ํ ๋ณํ๊ฐ ์ผ์ด๋ ์ ์์ด.
๐ก ํ๋ก ํ: ํ์ ๊ฐ๋ ํจ์๋ ์์ ํจ์๋ก ๋ง๋ค์ด. ์ฆ, ํ์ ์ฒดํฌ ์ธ์ ๋ค๋ฅธ ์ผ์ ํ์ง ์๋๋ก ํด!
4. ํ์ ๋จ์ธ(Type Assertion)์ ๊ณผ๋ํ ์ฌ์ฉ
ํ์ ๊ฐ๋ ๋์ ํ์ ๋จ์ธ์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ํ์ ์์ ์ฑ์ด ๋จ์ด์ง ์ ์์ด.
function processValue(value: string | number) {
// ์ข์ง ์์ ๋ฐฉ๋ฒ
console.log((value as string).toUpperCase());
// ๋ ๋์ ๋ฐฉ๋ฒ
if (typeof value === 'string') {
console.log(value.toUpperCase());
} else {
console.log(value.toFixed(2));
}
}
ํ์ ๋จ์ธ๋ณด๋ค๋ ํ์ ๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํด. ํ์ ๋จ์ธ์ ์ ๋ง ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํด.
์ด๋ฐ ์ฃผ์์ฌํญ๋ค์ ์ ๊ธฐ์ตํ๊ณ ์์ผ๋ฉด, ํ์ ๊ฐ๋๋ฅผ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฑฐ์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ์ ์กฐ์ธ์ ์ ํ์ฉํด ํ๋ก์ ํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ง๋ฌด๋ฆฌํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ!
์, ์ด์ ํ์ ๊ฐ๋์ ์ฃผ์์ฌํญ๊น์ง ์์๋ดค์ด. ์ด๋, ํ์ ์คํฌ๋ฆฝํธ ๋ง์คํฐ๊ฐ ๋ ๊ฒ ๊ฐ์ง ์์? ๐ ํ์ง๋ง ์ฐ๋ฆฌ์ ์ฌ์ ์ ์์ง ๋๋์ง ์์์ด. ๋ง์ง๋ง์ผ๋ก ํ์ ๊ฐ๋์ ๋ฒ ์คํธ ํ๋ํฐ์ค์ ๋ํด ์์๋ณด์๊ณ . ์ค๋น๋๋? ๋ง์ง๋ง ์คํผํธ๋ค! ๐
๐ ํ์ ๊ฐ๋ ๋ฒ ์คํธ ํ๋ํฐ์ค
์, ์ด์ ์ฐ๋ฆฌ์ ํ์ ๊ฐ๋ ์ฌ์ ์ ๋ง์ง๋ง ๋จ๊ณ์ผ! ์ง๊ธ๊น์ง ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ํ์ ๊ฐ๋๋ฅผ ๊ฐ์ฅ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ต๊ณ ์ ์ ๋ฌธ๊ฐ๋ค์ด ๊ณต์ ํ๋ ๋ ธํ์ฐ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ! ๐
1. ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ํ์ ๊ฐ๋ ์์ฑํ๊ธฐ
ํ์ ๊ฐ๋๋ ๊ฐ๋ฅํ ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํด์ผ ํด. ๋ณต์กํ ๋ก์ง์ ํผํ๊ณ , ํ ๋ฒ์ ํ๋์ ํ์ ๋ง ์ฒดํฌํ๋ ๊ฒ ์ข์.
// ์ข์ ์
function isString(value: unknown): value is string {
return typeof value === 'string';
}
function isNumber(value: unknown): value is number {
return typeof value === 'number';
}
// ์ฌ์ฉ ์
function processValue(value: unknown) {
if (isString(value)) {
console.log(value.toUpperCase());
} else if (isNumber(value)) {
console.log(value.toFixed(2));
} else {
console.log('Unknown type');
}
}
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ํ์ ๊ฐ๋์ ์ญํ ์ด ๋ช ํํด์ง๊ณ , ์ฌ์ฌ์ฉ์ฑ๋ ๋์์ ธ.
2. ์ ๋์จ ํ์ ๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ
ํ์ ๊ฐ๋๋ ์ ๋์จ ํ์ ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ์ง๊ฐ๋ฅผ ๋ฐํํด. ๋ณต์กํ ํ์ ์ ๋ค๋ฃฐ ๋ ํนํ ์ ์ฉํ์ง.
type Shape = Circle | Rectangle | Triangle;
interface Circle {
kind: 'circle';
radius: number;
}
interface Rectangle {
kind: 'rectangle';
width: number;
height: number;
}
interface Triangle {
kind: 'triangle';
base: number;
height: number;
}
function calculateArea(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'rectangle':
return shape.width * shape.height;
case 'triangle':
return 0.5 * shape.base * shape.height;
}
}
์ด๋ฐ ์์ผ๋ก ์ ๋์จ ํ์ ๊ณผ ํ์ ๊ฐ๋๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด, ๋ณต์กํ ํ์ ๋ ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์์ด.
3. ์ ๋ค๋ฆญ๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ
์ ๋ค๋ฆญ๊ณผ ํ์ ๊ฐ๋๋ฅผ ์กฐํฉํ๋ฉด ๋์ฑ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด.
function isArrayOfType<T>(value: unknown, typeGuard: (item: unknown) => item is T): value is T[] {
return Array.isArray(value) && value.every(typeGuard);
}
// ์ฌ์ฉ ์
const numbers = [1, 2, 3, 4, 5];
if (isArrayOfType(numbers, isNumber)) {
console.log(numbers.reduce((a, b) => a + b, 0));
}
์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ํ์ ์ ๋ฐฐ์ด์ด๋ ์์ ํ๊ฒ ์ฒดํฌํ ์ ์์ด. ์ ๋ง ๊ฐ๋ ฅํ์ง?
4. ํ์ ๊ฐ๋์ early return ํจํด
ํ์ ๊ฐ๋์ early return ํจํด์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์์ด.
function processValue(value: string | number | boolean) {
if (typeof value === 'string') {
console.log(value.toUpperCase());
return;
}
if (typeof value === 'number') {
console.log(value.toFixed(2));
return;
}
console.log(value ? 'True' : 'False');
}
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ํ์ ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋ช ํํ ๊ตฌ๋ถ๋๊ณ , ์ค์ฒฉ๋ if๋ฌธ์ ํผํ ์ ์์ด.
๐ก ํ๋ก ํ: ํ์ ๊ฐ๋๋ฅผ ์์ฑํ ๋๋ ํญ์ ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๊ณ ๋ คํด. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํด!
์ด๋ ๊ฒ ํ์ ๊ฐ๋์ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์ ์ฉํ๋ฉด, ๋์ TypeScript ์ฝ๋๋ ํ์ธต ๋ ์์ ํ๊ณ ์ฝ๊ธฐ ์ฌ์์ง ๊ฑฐ์ผ. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ต๊ณ ์ ์ ๋ฌธ๊ฐ๋ค์ ์กฐ์ธ์ ๋ชจ๋ ์ ์ฉํ ๊ฒ์ฒ๋ผ ๋ง์ด์ผ!
์, ์ด์ ์ฐ๋ฆฌ์ ํ์ ๊ฐ๋ ์ฌ์ ์ด ๋๋ฌ์ด. ์ด๋, ํ์ ์คํฌ๋ฆฝํธ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ํ๋๋ฅผ ์์ ํ ๋ง์คํฐํ ๊ฒ ๊ฐ์ง ์์? ๐ ์ด์ ๋๋ ํ์ ๊ฐ๋๋ฅผ ์์ ์์ฌ๋ก ์ฌ์ฉํ ์ ์๋ TypeScript ๋ง์คํฐ์ผ! ์์ผ๋ก ๋ ๋ฉ์ง ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ ๊ฑฐ์ผ. ํ์ดํ ! ๐ช
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ