Unit5 - [TypeScript] ๊ธฐ์ดˆ

๊ฐ•์„ฑ์ผยท2023๋…„ 7์›” 26์ผ
0
post-thumbnail

โœ… TIL


์š”์ฆ˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ๋Š” TypeScript๋ฅผ ๋„๋ฆฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด,
JavaScript๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๋™์‹œ์— TypeScript๋ฅผ ์Šต๋“ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๋‹ค.

TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ฑ„์šฉ ๊ณผ์ •์—์„œ๋„ ํƒˆ๋ฝํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ •๋„๋กœ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ด ๋˜์—ˆ๋‹ค.

์ด๋ฒˆ ์œ ๋‹›์€ TypeScript์˜ ๊ธฐ์ดˆ์ ์ธ ๋ฌธ๋ฒ•์„ ํ•™์Šตํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์— TypeScript๋ฅผ
์„ธํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์Šตํ•˜์—ฌ ์ฒ˜์Œ ์ ‘ํ•ด๋„ ์‰ฝ๊ฒŒ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.



TypeScript๋ž€


TypeScript๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๊ฐœ๋ฐœํ•œ JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ(Superset) ์–ธ์–ด์ด๋‹ค.

JavaScript์— ์ •์ ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐœ๋ฐœ๋œ ์–ธ์–ด๋กœ,
JavaScript๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ ์ƒ๊ธด ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


TypeScript์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

TypeScript๋ฅผ ์ด์•ผ๊ธฐํ•˜๊ธฐ์— ์•ž์„œ, JavaScript์— ๋Œ€ํ•ด ๋จผ์ € ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ๋‹ค.

JavaScript๋Š” ์ฒ˜์Œ์—๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์กŒ์—ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ ์  ํ๋ฅด๊ณ , JavaScript๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์ฆ๊ฐ€ํ•˜๋ฉด์„œ,
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ•„์š”๋กœ ํ•˜๋Š” JavaScript ์ฝ”๋“œ์˜ ์–‘์ด ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋กœ ์ธํ•ด JavaScript์˜ ํ•œ๊ณ„๊ฐ€ ๋ถ€๊ฐ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. JavaScript๋Š” ๋™์  ํƒ€์ž…์ด ๊ฒฐ์ •๋˜์–ด ์œ ์—ฐํ•˜๊ณ ,
๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ํƒ€์ž…์˜ ๋ช…์‹œ์„ฑ์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

ํƒ€์ž…์˜ ๋ช…์‹œ์„ฑ์ด ๋ถ€์กฑํ•˜๊ฒŒ ๋˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๊ทธ ์˜ˆ์‹œ์ด๋‹ค.

let add = (x, y) => {
	return x + y;
}

add(5, "7");


์œ„์˜ ์ฝ”๋“œ๋Š” add ํ•จ์ˆ˜์— ์ˆซ์ž 5์™€ ๋ฌธ์ž์—ด "7"์„ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ง์…ˆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ณผ๋Š” "57"์ด ๋‚˜์˜จ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ JavaScript๋Š” ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž๋ฅผ ๋”ํ•  ๊ฒฝ์šฐ, ์ˆซ์ž ํƒ€์ž…์˜ ์ธ์ˆ˜ ์ชฝ์„ ๊ฐ•์ œ์ ์œผ๋กœ ํƒ€์ž… ๋ณ€ํ™˜ํ•ด ๋ฌธ์ž์—ด์„ ๋งŒ๋“ ๋‹ค. ์ด๋ ‡๊ฒŒ JavaScript๋Š” ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด TypeScript๋ผ๋Š” ์–ธ์–ด๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


TypeScript๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ์‹œ ์žฅ์ 

TypeScript๋Š” ์ •์ ํƒ€์ž… ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋ฉฐ, ํ˜‘์—… ์‹œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ TypeScript๋Š” ES6์˜ ๋ฌธ๋ฒ•์„ ํฌํ•จํ•œ ์ตœ์‹  JavaScript ๋ฌธ๋ฒ•์„ ์ง€์›ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค(Interface), ์ œ๋„ค๋ฆญ(Generic), ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorators) ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

์•„๋ž˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค(Interface)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ ์˜ˆ์‹œ์ด๋‹ค.

interface User {
  id: number;
  name: string;
}

function greetingUser(user: User) {
	 console.log(`Hello, ${user.name}!`)
}

const parkUser = {
	id: 1,
  name: "๋ฐ•ํ•ด์ปค"
};

greetingUser(parkUser);


์œ„์˜ ์ฝ”๋“œ๋Š” User ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด User์˜ ์ •๋ณด๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  greetingUser ํ•จ์ˆ˜์—๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ User ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด
์ด ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ํƒ€์ž…์˜ ์ธ์ž๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ TypeScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ํƒ€์ž…์„ ๋ช…์‹œํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ์˜๋„ ๋˜ํ•œ ๋ช…ํ™•ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ
์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋˜ํ•œ ๋†’์•„์ง„๋‹ค.



TypeScript์˜ ํƒ€์ž…


TypeScript๋Š” JavaScript์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์›ํ•œ๋‹ค.

Boolean(๋ถˆ๋ฆฌ์–ธ) ํƒ€์ž…

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ, JavaScript์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
boolean ๊ฐ’์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ฐธ(true), ๊ฑฐ์ง“(false) ๊ฐ’์ด๋‹ค.

let isShow: boolean = true;
let isDone: boolean = false;

Number(์ˆซ์ž) ํƒ€์ž…

TypeScript์—์„œ Number ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. JavaScript์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ TypeScript ๋˜ํ•œ ์ •์ˆ˜์™€ ์‹ค์ˆ˜์˜ ๊ตฌ๋ถ„ ์—†์ด Number ํƒ€์ž… ํ•˜๋‚˜๋กœ ํ‘œ๊ธฐํ•œ๋‹ค. TypeScript๋Š” ์ด ์™ธ์—๋„ ์ถ”๊ฐ€๋กœ bigint๋ฅผ ์ง€์›ํ•œ๋‹ค.

let number1: number = 5;
let number2: number = 0.7;

String(๋ฌธ์ž์—ด) ํƒ€์ž…

TypeScript๋Š” JavaScript์ฒ˜๋Ÿผ ํฐ๋”ฐ์˜ดํ‘œ(")๋‚˜ ์ž‘์€๋”ฐ์˜ดํ‘œ(')๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
๋˜ํ•œ ๋ฐฑํ‹ฑ(`)์„ ์‚ฌ์šฉํ•œ ๋ฌธ์ž์—ด์ธ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

let firstName: string = "coding";
let lastName: string = 'kim';
let longString: string = `Kimcoding is a developer.
He is 20 years old.`

Array(๋ฐฐ์—ด) ํƒ€์ž…

TypeScript๋Š” JavaScript์ฒ˜๋Ÿผ ๊ฐ’๋“ค์„ ๋ฐฐ์—ด๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐ์—ด ํƒ€์ž…์„ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•
let items: string[] = ["apple", "banana", "grape"];

// ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•
let numberList: Array<number> = [4, 7, 100];

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž… ๋’ค์— ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” []์„ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.
์ด์–ด ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Array๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ ๋’ค, <> ์•ˆ์— ๋ฐฐ์—ด์˜ ์š”์†Œ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…์„ ์ž‘์„ฑํ•œ๋‹ค.

๋ฐฐ์—ด ํƒ€์ž…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํƒ€์ž…์„ ํ˜ผ์šฉํ•ด์„œ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.


Tuple(ํŠœํ”Œ) ํƒ€์ž…

TypeScript์—์„œ ํŠœํ”Œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ์˜ ํƒ€์ž…๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๊ณ ์ •๋œ ๋ฐฐ์—ด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

let user: [string, number, boolean] = ["kimcoding", 20, true];

๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ „๋ถ€ ๊ฐ™์„ ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๋ฐฐ์—ด์˜ index๋งˆ๋‹ค
ํƒ€์ž…์ด ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•œ index์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

console.log(user[2].toString());

์ด๋ ‡๊ฒŒ user[2]์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด, user[2]์— ์žˆ๋Š” ์š”์†Œ๋Š” boolean ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

JavaScript์—์„œ๋„ ํŠœํ”Œ ํƒ€์ž…์„ ์ง€์›ํ•˜๋ฉฐ, JavaScript์—์„œ์˜ ํŠœํ”Œ ๋˜ํ•œ
์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ JavaScript์—์„œ๋Š” ํŠœํ”Œ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํŠœํ”Œ์˜ ๊ฐ ์š”์†Œ์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ณ  ์œ ์ถ”ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋” ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.

TypeScript์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ ์ค‘ ํ•˜๋‚˜์ธ ํƒ€์ž… ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ ์ž ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ•˜๋‹ค.


Object(๊ฐ์ฒด) ํƒ€์ž…

TypeScript์—์„œ ๊ฐ์ฒด๋Š” JavaScript์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›์‹œ ํƒ€์ž…์ด ์•„๋‹Œ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

JavaScript์—์„œ Object(๊ฐ์ฒด) ํƒ€์ž…์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๋Š” JavaScript์˜ ๊ฐ’์„ ๋งํ•˜๋ฉฐ
typeof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ โ€œobjectโ€์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ฌ JavaScript์˜ ์›์‹œ ํƒ€์ž…์—๋Š” number, string, boolean, undefined, null, symbol์ด ์žˆ๋‹ค.

let obj: object = {};

TypeScript์—์„œ object ํƒ€์ž…์€ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ˆ˜์šฉํ•˜๋Š” ํƒ€์ž…์œผ๋กœ,
๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…๋“ค์ด any๋กœ ์ง€์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋– ํ•œ ํ”„๋กœํผํ‹ฐ๋ผ๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํƒ€์ž…๋“ค์„ ๊ฐ๊ธฐ ๋ช…์‹œํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹๋‹ค.

๊ฐ์ฒด๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ key-value์— ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…๊นŒ์ง€๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

let user: {name: string, age: number} = {
	name: "kimcoding",
	age: 20
}

Any ํƒ€์ž…

๊ฐ„ํ˜น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ, ์•Œ์ง€ ๋ชปํ•˜๋Š” ํƒ€์ž…์„ ํ‘œํ˜„ํ•ด์•ผ ํ•  ๋•Œ๋„ ์žˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ ์œ ์ €๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๋ฐ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ธ ๊ฒฝ์šฐ
๊ฐœ๋ฐœ์ž๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํƒ€์ž…์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ ์ž ํ•  ๋•Œ any ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

let maybe: any = 4;

any ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋ณ€์ˆ˜์— ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ํƒ€์ž…์„ ๋ช…์‹œํ•œ
๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ํƒ€์ž…์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

let obj: object = {};

// ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
obj = "hello";

let maybe: any = 4;

// ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
maybe = true;

๋˜ํ•œ ์—„๊ฒฉํ•œ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ ํ• ๋‹น๋œ
๊ฐ’์ด ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ๋ฐ ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๋Œ€์‹ , ์‹ค์ œ ํ• ๋‹น๋œ ๊ฐ’์ด ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ ๋ฐ ํ”„๋กœํผํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ undefined์ด๋‹ค.

let maybe: any = 4;

// undefined๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
console.log(maybe.length);

๋˜ํ•œ any ํƒ€์ž…์€ ํƒ€์ž…์˜ ์ผ๋ถ€๋งŒ ์•Œ๊ณ , ์ „์ฒด๋Š” ์•Œ์ง€ ๋ชปํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์—ฌ๋Ÿฌ ํƒ€์ž…์ด ์„ž์ธ ๋ฐฐ์—ด์„ ๋ฐ›๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

let list: any[] = [1, true, "free"];

// any๋กœ ๋‹ค๋ฃจ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— index 1๋ฒˆ์งธ ์š”์†Œ๊ฐ€ boolean ํƒ€์ž…์ด์ง€๋งŒ number ํƒ€์ž…์œผ๋กœ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.
list[1] = 100;


TypeScript์˜ ํ•จ์ˆ˜


JavaScript์—์„œ ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค.

JavaScript์—์„œ์˜ ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ TypeScript์—๋„ ํ•จ์ˆ˜๋Š” JavaScript์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
๊ธฐ๋ช… ํ•จ์ˆ˜(named function)์™€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(arrow function) ๋“ฑ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

JavaScript์—์„œ ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค.

// named function
function add(x, y){
	return x + y;
}

// arrow function
let add = (x, y) => {
	return x + y;
}


์ด๋ฅผ TypeScript๋กœ ๋‹ค์‹œ ํ‘œํ˜„ํ•ด ๋ณด๊ฒ ๋‹ค.

// named function
function add(x: number, y: number):number {
	return x + y;
}

// arrow function
let add = (x: number, y: number): number => {
	return x + y;
}


TypeScript์—์„œ ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…๊ณผ ๋ฆฌํ„ด๊ฐ’์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž…์„ ์ž‘์„ฑํ•˜๊ณ , ๋ฆฌํ„ด๊ฐ’์˜ ํƒ€์ž…์„ ๊ด„ํ˜ธ ๋’ค์— ์ž‘์„ฑ์„ ํ•˜๋ฉด ๋œ๋‹ค.
๋ฐ˜ํ™˜๋˜๋Š” ํƒ€์ž…์€ ํƒ€์ž…์ถ”๋ก ์„ ์ด์šฉํ•˜์—ฌ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

// named function
function add(x: number, y: number) {
	return x + y;
}

// arrow function
let add = (x: number, y: number) => {
	return x + y;
}

์ด๋ ‡๊ฒŒ ๋ฆฌํ„ด๊ฐ’์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ TypeScript ์ปดํŒŒ์ผ์ด ์Šค์Šค๋กœ ํŒ๋‹จํ•ด์„œ ํƒ€์ž…์„ ๋„ฃ์–ด์ฃผ๋ฉฐ, ์ด๊ฒƒ์ด ํƒ€์ž… ์ถ”๋ก ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ํ•จ์ˆ˜์— ๋ฆฌํ„ด๊ฐ’์ด ์—†๋‹ค๋ฉด, void๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

let printAnswer = (): void => {
	console.log("YES");
}


๋˜ํ•œ TypeScript๋Š” JavaScript์™€ ๋‹ฌ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜์— ๋งž์ถฐ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

let greeting = (firstName: string, lastName: string): string => {
	return `hello, ${firstName} ${lastName}`;
}

// ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
greeting('coding');

// ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
greeting('coding', 'kim');

// ๋„ˆ๋ฌด ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
greeting('coding', 'kim', 'hacker');


๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, undefined๋ฅผ ์ „๋‹ฌํ–ˆ์„ ๋•Œ ํ• ๋‹น๋  ๋งค๊ฐœ๋ณ€์ˆ˜์˜
๊ฐ’์„ ์ •ํ•ด๋†“์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” JavaScript์—์„œ์˜ default parameter์™€ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.

let greeting = (firstName: string, lastName: string ="kim"): string => {
	return `hello, ${firstName} ${lastName}`;
}

// ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. 
greeting('coding');

// ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
greeting('coding', undefined);

// ๋„ˆ๋ฌด ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
greeting('coding', 'kim', 'hacker');


์ด๋•Œ๋Š” ๋’ค์˜ ์ธ์ž๋กœ undefined๋ฅผ ๋ณด๋‚ด๋„ ๊ฐ’์€ โ€œhello, coding kimโ€์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

ํ˜น์€ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„ ๋์— ๋ฌผ์Œํ‘œ(?)๋ฅผ ๋ถ™์ž„์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

let greeting = (firstName: string, lastName?: string): string => {
	return `hello, ${firstName} ${lastName}`;
}

// ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
greeting('coding');

// ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.
greeting('coding', 'kim');

// ๋„ˆ๋ฌด ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณด๋‚ด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
greeting('coding', 'kim', 'hacker');


๊ทธ๋Ÿฌ๋‚˜ ์ด๋•Œ๋Š” greating('coding')๊ณผ ๊ฐ™์ด ์ „๋‹ฌ์ธ์ž๋ฅผ
ํ•˜๋‚˜๋งŒ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋’ค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” undefined๋กœ ๋ฐ˜ํ™˜์ด ๋œ๋‹ค.



TypeScript์˜ ์—ฐ์‚ฐ์ž ํ™œ์šฉ ํƒ€์ž…


TypeScript๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ํƒ€์ž…์„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

JavaScript์—์„œ๋„ ๋ณด์•˜๋˜ ||(OR) ์—ฐ์‚ฐ์ž๋‚˜ && (AND)์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

| ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ํƒ€์ž…์„ ์œ ๋‹ˆ์˜จ(Union) ํƒ€์ž…์ด๋ผ๊ณ  ํ•˜๋ฉฐ,
& ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ํƒ€์ž…์€ ์ธํ„ฐ์„น์…˜(Intersection) ํƒ€์ž…์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


์œ ๋‹ˆ์˜จ(Union) ํƒ€์ž…


์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ๋‘˜ ์ด์ƒ์˜ ํƒ€์ž…์„ ํ•ฉ์ณ์„œ ๋งŒ๋“ค์–ด์ง„ ์ƒˆ๋กœ์šด ํƒ€์ž…์ด๋‹ค.

| ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ || (OR) ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์ด โ€œA์ด๊ฑฐ๋‚˜ B์ด๋‹คโ€๋ผ๋Š” ์˜๋ฏธ์˜ ํƒ€์ž…์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, number | string์€ ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด ํƒ€์ž…์„ ์˜๋ฏธํ•œ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ ๋ณด๊ฒ ๋‹ค.

function printValue(value: any): void {
  if (typeof value === "number") {
    console.log(`The value is a number: ${value}`);
  } else {
    console.log(`The value is a string: ${value}`);
  }
}

printValue(10); // The value is a number: 10
printValue("hello"); // The value is a string: hello


์œ„์˜ ์ฝ”๋“œ๋Š” value ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ any๋กœ ์ •์˜ํ•˜๊ณ ,
ํƒ€์ž…์ด number์ธ์ง€ string์ธ์ง€์— ๋”ฐ๋ผ if-else ๋ฌธ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ any๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ JavaScript๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ํฐ ์ฐจ์ด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—,
์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด TypeScript์˜ ์ด์ ์„ ์‚ด๋ฆฌ๋ฉด์„œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

function printValue(value: number|string): void {
  if (typeof value === "number") {
    console.log(`The value is a number: ${value}`);
  } else {
    console.log(`The value is a string: ${value}`);
  }
}

printValue(10); // The value is a number: 10
printValue("hello"); // The value is a string: hello


์œ„์˜ printValue ํ•จ์ˆ˜๋Š” ์ˆซ์ž ๋˜๋Š” ๋ฌธ์ž์—ด ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๊ณ  ์žˆ๋‹ค.

์ด๋•Œ, ์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด number | string ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์žˆ๋‹ค.

์ดํ›„ ์ž…๋ ฅ๋œ ๊ฐ’์˜ ํƒ€์ž…์„ typeof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์‚ฌํ•œ ํ›„,
ํ•ด๋‹น ๊ฐ’์ด ์ˆซ์ž์ธ ๊ฒฝ์šฐ์™€ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ๋‹ค์–‘ํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค.


์œ ๋‹ˆ์˜จ(Union) ํƒ€์ž…์˜ ์žฅ์ 

์œ ๋‹ˆ์˜จ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์— ๊ด€๋ จ๋œ API๋ฅผ ์‰ฝ๊ฒŒ ์ž๋™์™„์„ฑ์œผ๋กœ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ any ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†์–ด, ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

let value: string | number | boolean;

์ด๋ ‡๊ฒŒ string | number | boolean ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž… ์ค‘
ํ•˜๋‚˜์˜ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.


์œ ๋‹ˆ์˜จ(Union) ํƒ€์ž… ์‚ฌ์šฉ ์‹œ ์œ ์˜ํ•  ์ 

์œ ๋‹ˆ์˜จ ํƒ€์ž…์ธ ๊ฐ’์ด ์žˆ์œผ๋ฉด, ์œ ๋‹ˆ์˜จ์— ์žˆ๋Š” ๋ชจ๋“  ํƒ€์ž…์— ๊ณตํ†ต์ธ ๋ฉค๋ฒ„๋“ค์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Developer์™€ Person์„ ์ •์˜ํ–ˆ๋‹ค.

function askSomeone(someone: Developer | Person) {
	console.log(someone.name);
}

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์งˆ์ ์œผ๋กœ askSomenone ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” Developer์™€ Person์ด
๊ฐ–๊ณ  ์žˆ๋Š” ๊ณตํ†ต ํ”„๋กœํผํ‹ฐ์ธ name์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๊ณตํ†ต๋˜๊ณ  ๋ณด์žฅ๋œ ํ”„๋กœํผํ‹ฐ๋งŒ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ ๋‚˜๋จธ์ง€ ํ”„๋กœํผํ‹ฐ์—๋„ ์ ‘๊ทผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


๐Ÿ’ก ํƒ€์ž… ๊ฐ€๋“œ(Type Guard)๋ž€?

TypeScript์—์„œ ํƒ€์ž…์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

ํƒ€์ž… ๊ฐ€๋“œ๋Š” ํŠน์ • ์ฝ”๋“œ ๋ธ”๋ก์—์„œ ํƒ€์ž…์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•ด
ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์—์„œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ด ์ค€๋‹ค.


์•„๋ž˜ ์ฝ”๋“œ๋Š” ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ์ด๋‹ค.

function askSomeone(someone: Developer | Person) {
  // in ์—ฐ์‚ฐ์ž : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ์ฒด์˜ ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ์ฒดํฌํ•˜๋Š” ์—ฐ์‚ฐ์ž
  // in ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์†์„ฑ์ด ๊ฐ์ฒด ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌ
  if ('skill' in someone) {
    console.log(someone.skill);
  }

  if ('age' in someone) {
    console.log(someone.age);
  }
}

TypeScript์—์„œ๋Š” in ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

in ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ,
ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ์ฒด ๋‚ด์— ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.



์ธํ„ฐ์„น์…˜(Intersection) ํƒ€์ž…


์ธํ„ฐ์„น์…˜(Intersection)์€ ๋‘˜ ์ด์ƒ์˜ ํƒ€์ž…์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

& ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

type User = Developer & Person;


์ด๋Ÿฐ ์‹์œผ๋กœ ํƒ€์ž…์„ ๊ฒฐํ•ฉํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ User ๋ณ€์ˆ˜๋Š” Developer, Person ๊ฐ๊ฐ์— ์ •์˜๋œ ์†์„ฑ ๋ชจ๋‘๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ type ์€ ์ถ”ํ›„ ๋‚˜์˜ฌ ํƒ€์ž… ๋ณ„์นญ์—์„œ ๋ฐฐ์šฐ๊ฒŒ ๋˜๋ฏ€๋กœ,
์ง€๊ธˆ์€ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ์ง‘์ค‘ํ•˜๊ฒ ๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์ธํ„ฐ์„น์…˜์œผ๋กœ ํƒ€์ž…์„ ์—ฐ๊ฒฐํ•ด ํ•˜๋‚˜์˜ ๋‹จ์ผ ํƒ€์ž…์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž… ๊ฐ€๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

function askSomeone(someone: Developer & Person) {
  console.log(someone.age);
	console.log(someone.name);
	console.log(someone.skill);
}


์œ„์˜ ์ฝ”๋“œ๋Š” ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ Developer์™€ Person์„ ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ๋ฌถ์—ˆ๋‹ค.
๋”ฐ๋ผ์„œ askSomeone ํ•จ์ˆ˜ ๋‚ด์—์„  ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ์— ์ „๋ถ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์€ ํƒ€์ž… ๊ฐ€๋“œ๋Š” ํ•„์š” ์—†๋Š” ๋ฐ˜๋ฉด Developer์™€ Person์ด๋ผ๋Š” ์ƒˆ๋กœ์šด
๊ต์ง‘ํ•ฉ์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ „๋ถ€ ๋ณด๋‚ด์ค˜์•ผ๋งŒ ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ํ•ด์ค˜์•ผ ํ•˜์ง€๋งŒ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์„ ํƒ์ง€๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

interface Developer {
  name: string;
  skill: string;
}

interface Person {
  name: string;
  age: number;
}

function askSomeone(someone: Developer | Person) {
	// ์ด๋Ÿฐ ์‹์œผ๋กœ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  if ('skill' in someone) {
    console.log(someone.skill);
  }

  if ('age' in someone) {
    console.log(someone.age);
  }
}

// ์œ ๋‹ˆ์˜จ ํƒ€์ž…์€ ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์„ ํƒ์ง€๊ฐ€ ์ƒ๊ธด๋‹ค.
askSomeone({name: '๊น€์ฝ”๋”ฉ', skill: '์›น ๊ฐœ๋ฐœ'});
askSomeone({name: '๊น€์ฝ”๋”ฉ', age: 20});

function askSomeone2(someone: Developer & Person) {
	// ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  console.log(someone.age);
	console.log(someone.name);
	console.log(someone.skill);
}

// ๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐ์„น์…˜ ํƒ€์ž…์œผ๋กœ ๊ฒฐํ•ฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ „๋‹ฌ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์„ ํƒ์ง€๊ฐ€ ์—†๋‹ค.
askSomeone2({name: '๊น€์ฝ”๋”ฉ', skill: '์›น ๊ฐœ๋ฐœ', age:20});


TypeScript์˜ ์—ด๊ฑฐํ˜•(Enum)


TypeScript์˜ ์—ด๊ฑฐํ˜•(Enum)์€ ํŠน์ • ๊ฐ’์˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

JavaScript์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ด๊ฑฐํ˜•์„ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ,
TypeScript์—์„œ๋Š” ๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•๊ณผ ์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•์„ ์ง€์›ํ•œ๋‹ค.

enum Color {
  Red,
  Green,
  Blue,
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” Color๋ผ๋Š” ์—ด๊ฑฐํ˜•์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. ์—ด๊ฑฐํ˜•์˜ ๊ฐ’์€ Red, Green, Blue ์„ธ ๊ฐœ์ด๋‹ค.


์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•(Enum)

์—ด๊ฑฐํ˜•์€ ์ˆซ์žํ˜•๊ณผ ๋ฌธ์ž์—ดํ˜•, ํ˜น์€ ์ด ๋‘˜์˜ ์กฐํ•ฉ์œผ๋กœ ์ •์˜๋  ์ˆ˜ ์žˆ๋‹ค.
๋””ํดํŠธ ๊ฐ’์œผ๋กœ ์ˆซ์žํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ ๊ฐ’์€ ์ž๋™์œผ๋กœ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜๋™์œผ๋กœ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

enum Color {
  Red = 1,
  Green = 2,
  Blue = 4,
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” Red๊ฐ€ 1, Green์ด 2, Blue๊ฐ€ 4๋กœ ์ •์˜๋˜์—ˆ๋‹ค.

์—ด๊ฑฐํ˜•์˜ ๊ฐ’์— ๋Œ€ํ•ด ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

enum Color {
  Red = 1,
  Green = 2,
  Blue = 4,
}

let c: Color = Color.Green;
let greenValue: number = Color.Green;
let blueValue: number = Color.Blue;

console.log(c);          // ์ถœ๋ ฅ: 2
console.log(greenValue);  // ์ถœ๋ ฅ: 2
console.log(blueValue);   // ์ถœ๋ ฅ: 4

์—ด๊ฑฐํ˜•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๊ฐ’์„ ๋Œ€์‹ ํ•˜์—ฌ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์—ด๊ฑฐํ˜•์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
์—ด๊ฑฐํ˜•์€ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ฐ€๋…์„ฑ ๋†’๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์˜คํƒ€์™€ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค.


๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•(Enum)

๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•์€ ์•ž์—์„œ ์‚ดํŽด๋ณธ ์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•๊ณผ ๊ฐœ๋…์ ์œผ๋กœ๋Š” ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค.
๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•์€ ์—ด๊ฑฐํ˜•์˜ ๊ฐ’์„ ์ „๋ถ€ ๋‹ค ํŠน์ • ๋ฌธ์ž ๋˜๋Š” ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜• ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.

enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}

let myDirection: Direction = Direction.Up;
console.log(myDirection); // ์ถœ๋ ฅ: "UP"

์œ„ ์ฝ”๋“œ๋Š” Direction์ด๋ผ๋Š” ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜์˜ ์—ด๊ฑฐํ˜•(Enum)์„ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
Up, Down, Left, Right ๊ฐ๊ฐ์—๋Š” ๋ฌธ์ž์—ด ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  myDirection ๋ณ€์ˆ˜๋ฅผ Direction.Up์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค.
์ถœ๋ ฅ ๊ฒฐ๊ณผ๋กœ๋Š” "UP"์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

๋˜ํ•œ ๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•์—๋Š” ์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ auto-incrementing์ด ์—†๋‹ค.

๋Œ€์‹  ๋””๋ฒ„๊น…์„ ํ•  ๋•Œ ์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•์˜ ๊ฐ’์€ ๊ฐ€๋” ๋ถˆ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜์˜ฌ ๋•Œ๊ฐ€ ์žˆ์ง€๋งŒ
๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•์€ ํ•ญ์ƒ ๋ช…ํ™•ํ•œ ๊ฐ’์ด ๋‚˜์™€ ์ฝ๊ธฐ ํŽธํ•˜๋‹ค.

๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜์˜ ์—ด๊ฑฐํ˜•์€ ์ฃผ๋กœ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’์„ TypeScript์—์„œ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, HTTP ์š”์ฒญ ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—ด๊ฑฐํ˜•์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

enum HttpMethod {
  Get = "GET",
  Post = "POST",
  Put = "PUT",
  Delete = "DELETE",
}

function makeRequest(url: string, method: HttpMethod) {
  // ...
}

makeRequest("/api/data", HttpMethod.Post);


์œ„ ์ฝ”๋“œ์—์„œ๋Š” HTTP ์š”์ฒญ ๋ฐฉ์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” HttpMethod ์—ด๊ฑฐํ˜•์„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.
makeRequest ํ•จ์ˆ˜๋Š” URL๊ณผ HTTP ์š”์ฒญ ๋ฐฉ์‹์„ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
HTTP ์š”์ฒญ ๋ฐฉ์‹์„ ์ง€์ •ํ•  ๋•Œ๋Š” HttpMethod.Post์™€ ๊ฐ™์ด ์—ด๊ฑฐํ˜• ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์—ด๊ฑฐํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํƒ€์™€ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.


์—ญ ๋งคํ•‘ (Reverse mappings)

์—ญ ๋งคํ•‘์€ ์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•์—๋งŒ ์กด์žฌํ•˜๋Š” ํŠน์ง•์ž…๋‹ˆ๋‹ค.
์—ด๊ฑฐํ˜•์˜ ํ‚ค(key)๋กœ ๊ฐ’(value)์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ๊ฐ’(value)์œผ๋กœ ํ‚ค(key)๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ๋‹ค.

enum Enum {
    A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"

์œ„์™€ ๊ฐ™์ด ์—ด๊ฑฐํ˜•์˜ ํ‚ค๋กœ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ’์œผ๋กœ๋„ ์—ด๊ฑฐํ˜•์˜ ํ‚ค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Š” ์ˆซ์žํ˜• ์—ด๊ฑฐํ˜•์—๋งŒ ์กด์žฌํ•˜๋ฉฐ, ๋ฌธ์žํ˜• ์—ด๊ฑฐํ˜•์—์„œ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŠน์ง•์ด๋‹ค.



TypeScript์˜ ์ธํ„ฐํŽ˜์ด์Šค(Interface)


TypeScript์—์„œ ์ธํ„ฐํŽ˜์ด์Šค(Interface)๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํƒ€์ž… ์ฒดํฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ์ด ๋œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ํ•œ๋‹ค. JavaScript๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋”ฐ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, TypeScript๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค. TypeScript์˜ ์˜ˆ์•ฝ์–ด์ธ interface๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TypeScript ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์•ฝ์–ด(reserved word) : ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ด๋ฏธ ๋ฌธ๋ฒ•์ ์ธ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋‹จ์–ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด return, import, const, let ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฐ ๋‹จ์–ด๋“ค์€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด๋‚˜ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.


๋ณ€์ˆ˜์™€ ์ธํ„ฐํŽ˜์ด์Šค


TypeScript์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
TypeScript์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด(Object)์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ์•ฝ์–ด์ด๋‹ค.

interface User {
	name: string;
	age: number;
}

// ์ •์ƒ์ ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค.
const user: User = {
	name: "anna",
	age: 20
}

// ํ”„๋กœํผํ‹ฐ์˜ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์•„๋„ ์ •์ƒ์ ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค.
const user: User = {
	age: 20,
	name: "anna"
}

// ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋ณด๋‹ค ์ ๊ฒŒ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
const user: User = {
	name: "anna"
}

// ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋ณด๋‹ค ๋งŽ์ด ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
const user: User = {
	name: "anna",
	age: 20,
	job: "developer"
}


์œ„์˜ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด interface ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ User ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์˜ˆ์•ฝ์–ด๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„์„ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„์„ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ *๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์ด๋‹ค.

๐Ÿ’ก ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜(Naming Convention) : ์ด๋ฆ„์„ ์ง“๋Š” ์ผ์ข…์˜ ๊ด€๋ก€์ด๋‹ค. TypeScript๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ด๋ฆ„์„ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ์ž‘์„ฑํ•œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ , ๊ฐ์ฒด๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ด€๋ก€๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์—๋Š” name๊ณผ age๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, User ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ „๋ถ€ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ interface๋กœ ์ •์˜๋œ ์†์„ฑ๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ์™ธ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•ด๋„ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋” ์ž‘์„ฑํ•˜์—ฌ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์•ˆ์˜ ๋ชจ๋“  ํ”„๋กœํผํ‹ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์–ด๋–ค ์กฐ๊ฑด์—์„œ๋งŒ ์กด์žฌํ•˜๊ฑฐ๋‚˜
์•„์˜ˆ ์—†์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ์  ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

interface User {
	name: string;
	age?: number;
}

// ์ •์ƒ์ ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค.
const user: User = {
	name: "anna"
}

ํ•จ์ˆ˜์™€ ์ธํ„ฐํŽ˜์ด์Šค


์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„๊ณผ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ ,
ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

interface User {
	name: string;
	age: number;
	job: string;
}

interface Greeting {
	(user: User, greeting: string): string;
}

const greet: Greeting = (user, greeting) => {
	return `${greeting}, ${user.name}! Your job : ${user.job}.`;
}

const user: User = {
	name: "anna",
	age: 30,
	job: "developer"
};

const message = greet(user, "Hi");

console.log(message);


์œ„์˜ ์ฝ”๋“œ๋Š” User ์ธํ„ฐํŽ˜์ด์Šค ์™ธ์—๋„ Greeting ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•˜์—ฌ ํ•จ์ˆ˜ ํƒ€์ž…์„ ์ •์˜ํ–ˆ๋‹ค.

Greeting ์ธํ„ฐํŽ˜์ด์Šค๋Š” User ํƒ€์ž…๊ณผ ๋ฌธ์ž์—ด ํƒ€์ž…์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๋ฌธ์ž์—ด ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

greet ํ•จ์ˆ˜๋Š” Greeting์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ,
user ๊ฐ์ฒด์™€ ๋ฌธ์ž์—ด "hi"๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Greeting ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ด๋ฏธ greet์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์ธ user์™€ greeting์˜ ํƒ€์ž…๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, greet ํ•จ์ˆ˜๋Š” string ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ํƒ€์ž… ๋˜ํ•œ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.


ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค


ํด๋ž˜์Šค์—์„œ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

interface Calculator {
	add(x: number, y: number): number;
	substract(x: number, y: number): number;
}

class SimpleCalculator implements Calculator {
	add(x: number, y:number) {
		return x + y;
	}

	substract(x: number, y: number) {
		return x - y;
	}
}

const caculator = new SimpleCalculator();

console.log(caculator.add(4, 9)); //13
console.log(caculator.substract(10, 5)); //5

์œ„์˜ ์ฝ”๋“œ์—์„œ Calculator ์ธํ„ฐํŽ˜์ด์Šค๋Š” add์™€ substract ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๊ณ ,
SimpleCaculator ํด๋ž˜์Šค๋Š” Calculator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.

Caculator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SimpleCaculator ํด๋ž˜์Šค ๋‚ด์—๋Š”
Calculator ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์ •์˜๋œ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.



์ธํ„ฐํŽ˜์ด์Šค์™€ ์ƒ์†


JavaScript์—์„œ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ๋•Œ extends๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด
๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•ด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sayHello() {
    console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
  }
}

// Person ํด๋ž˜์Šค๋ฅผ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์†ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์ธ Student๋ฅผ ์ •์˜ํ–ˆ๋‹ค.
class Student extends Person {
  constructor(name, age, grade) {
    super(name, age);
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying hard for the grade ${this.grade}.`);
  }
}


์ด๊ฐ™์ด ์ธํ„ฐํŽ˜์ด์Šค๋„ extends๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•ด ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค์—
๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์ฃผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.

interface Person {
    name: string;
    age: number;
}

interface Developer extends Person {
    language: string;
}

const person: Developer = {
    language: "TypeScript",
    age: 20,
    name: "Anna",
}


์ด๋ ‡๊ฒŒ ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ Person ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ extends ํ‚ค์›Œ๋“œ๋กœ ์ƒ์†ํ•ด ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค์ธ
Developer๋ฅผ ๋งŒ๋“ค๊ณ , Developer ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ person์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

Developer ์ธํ„ฐํŽ˜์ด์Šค๋Š” Person ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ,
Person ๋‚ด๋ถ€์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ™•์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ์—์„œ๋Š” ํƒ€์ž… ๋‹จ์–ธ(type assertion)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ,
์ฝ”๋“œ๋ฅผ ๋ณธ ํ›„ ํƒ€์ž… ๋‹จ์–ธ์— ๋Œ€ํ•ด์„œ๋„ ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

interface FoodStuff {
    name: string;
}

interface FoodAmount {
    amount: number;
}

interface FoodFreshness extends FoodStuff, FoodAmount {
	   isFreshed: boolean;
}

const food = {} as FoodFreshness;

food.name = "egg";
food.amount = 2;
food.isFreshed = true;


์œ„์˜ ์ฝ”๋“œ์—์„œ food ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋นˆ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณด๊ฒ ๋‹ค.

์—ฌ๊ธฐ์„œ as๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์— FoodFeshness๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•˜๊ณ  ์žˆ๋Š”๋ฐ,
์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ•์„ ํƒ€์ž… ๋‹จ์–ธ(type assertion) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํƒ€์ž… ๋‹จ์–ธ์€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํŠน์ • ํƒ€์ž… ์ •๋ณด์˜ ์‚ฌ์šฉ์„ ๊ฐ•์ œํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ,
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์›ํ•˜๋Š” ์ž„์˜์˜ ํƒ€์ž…์„ ๊ฐ’์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.



TypeScript์˜ ํƒ€์ž… ๋ณ„์นญ(Type Aliases)


ํƒ€์ž… ๋ณ„์นญ(Type Aliases)์€ ํƒ€์ž…์˜ ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Š” ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ๊ธฐ์กด์˜ ํƒ€์ž…์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํƒ€์ž… ๋ณ„์นญ์„ ์ด์šฉํ•˜์—ฌ ํƒ€์ž…์˜ ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋งŒ๋“ค ๋•Œ ํ‚ค์›Œ๋“œ type์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ๋‹ค.

type MyString = string;

let str1: string = 'hello!';

// string ํƒ€์ž…์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
let str2: MyString = 'hello world!';


์›๋ž˜ string์ด๋ผ๋Š” ํƒ€์ž…์ด ์กด์žฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ด์— myString์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ myString๊ณผ string์€ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ํƒ€์ž…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณณ์—๋Š” ํƒ€์ž… ๋ณ„์นญ์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํƒ€์ž… ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ๋ณต์žกํ•œ ํƒ€์ž…์„ ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ , ํƒ€์ž… ์ •์˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ๋‹ค.

type Person = {
  id: number;
  name: string;
  email: string;
}

// Commentary ์ธํ„ฐํŽ˜์ด์Šค์—์„œ Person ํƒ€์ž…์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.
interface Commentary {
  id: number;
  content: string;
  user: Person;
}

// ๊ฐ์ฒด์—์„œ Commentary ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.
let comment1: Commentary = {
    id: 1,
    content: "๋ญ์˜ˆ์š”?",
    user: {
        id: 1,
        name: "๊น€์ฝ”๋”ฉ",
        email: "kimcoding@codestates.com",
    },
}

// Commentary ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์— content ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— 
// content ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
let kimcoding: Commentary = {
    id: 1,
    user: {
        id: 1,
        name: "๊น€์ฝ”๋”ฉ",
        email: "kimcoding@codestates.com",
    },
};

// Person ํƒ€์ž… ๋‚ด๋ถ€์— isDeveloper ํ”„๋กœํผํ‹ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— 
// isDeveloper ํ”„๋กœํผํ‹ฐ๋ฅผ ์ž‘์„ฑํ•  ์‹œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
let kimcoding: Commentary = {
    id: 1,
    content: "๋ญ์˜ˆ์š”?",
    user: {
        id: 1,
        name: "๊น€์ฝ”๋”ฉ",
        email: "kimcoding@codestates.com",
        isDeveloper: true,
    },
};


์ด์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ
์ •์˜ํ•œ ํƒ€์ž…์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋จ์œผ๋กœ์จ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํƒ€์ž…์„ ์ฐธ์กฐํ•  ์‹œ์—๋Š”
์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‚ด๋ถ€์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ „๋ถ€ ์ฐธ์กฐํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๋˜ํ•œ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํƒ€์ž… ๋‚ด๋ถ€์— ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ ์™ธ์—
๋‹ค๋ฅธ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋” ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ ๋˜ํ•œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค vs ํƒ€์ž… ๋ณ„์นญ

ํƒ€์ž… ๋ณ„์นญ ๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ• ์„ ํƒ€์ž… ๋ณ„์นญ์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ํƒ€์ž… ๋ณ„์นญ์—๋Š” ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

type Person = {
    name: string;
    age: number;
}

interface User {
    name: string;
    age: number;
}

let kimcoding: Person = {
    name: '๊น€์ฝ”๋”ฉ',
    age: 30,
}

let coding: User = {
    name: '๊น€์ฝ”๋”ฉ',
    age: 30,
}

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋“ค์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.

์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ์ •์˜ํ•œ ํƒ€์ž…์ด๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์— ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ kimcoding์ด ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” Person ํƒ€์ž…๊ณผ, coding์ด
์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” User ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฐ๊ธฐ ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค๋†“์•„ ๋ณด์•˜๋‹ค.

VSCode๋กœ ์ž‘์„ฑ ์‹œ, kimcoding ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” Person์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด Person ๋‚ด๋ถ€์— ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ๋ณด์ธ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ coding ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” User์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด User ๋‚ด๋ถ€์— ์–ด๋–ค ํ”„๋กœํผํ‹ฐ๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ์ •์˜ํ•œ ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•  ์‹œ์—๋Š” ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค.

๋˜ ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

type Person = {
    name: string;
    age: number;
}

interface User {
    name: string;
    age: number;
}

// ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
type Students extends Person {
    className: string;  
}

// ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
interface Students extends User {
	 className: string;   
}

// ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
interface Students extends Person {
    className: string;  
}

ํƒ€์ž… ๋ณ„์นญ์€ ๋ง ๊ทธ๋Œ€๋กœ ํƒ€์ž…์— ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์—์„œ ๊ทธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ์กด์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํƒ€์ž… ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํƒ€์ž… ๋‘˜ ๋‹ค ์ƒ์†ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
์œ ์—ฐํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์–ด์„œ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.



TypeScript์˜ ํƒ€์ž… ์ถ”๋ก (Type Inference)


TypeScript๋Š” ์ •์ ํƒ€์ž…์„ ์ง€์›ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค.
์ •์ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ  ๋””๋ฒ„๊น…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

TypeScript๋Š” ํƒ€์ž… ์ถ”๋ก (Type Inference)์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋„์™€์ค€๋‹ค.


ํƒ€์ž… ์ถ”๋ก (Type Inference)์˜ ๊ธฐ๋ณธ

ํƒ€์ž… ์ถ”๋ก (Type Inference)์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„
TypeScript๊ฐ€ ์ž๋™์œผ๋กœ ์œ ์ถ”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

let isNumber = 123;

์ด ์ฝ”๋“œ์—์„œ๋Š” ๋ณ€์ˆ˜ isNumber๋ฅผ ์„ ์–ธํ•˜๊ณ , ์ˆซ์ž 123์„ ํ• ๋‹นํ–ˆ๋‹ค.
์ด ๊ฒฝ์šฐ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” isNumber์˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์ˆซ์ž(Number)๋กœ ์ถ”๋ก ํ•œ๋‹ค.


์ตœ์  ๊ณตํ†ต ํƒ€์ž… (Best common type)

TypeScript๋Š” ์—ฌ๋Ÿฌ ํ‘œํ˜„์‹์—์„œ ํƒ€์ž… ์ถ”๋ก ์ด ๋ฐœ์ƒํ•  ๋•Œ, ํ•ด๋‹น ํ‘œํ˜„์‹์˜ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ "์ตœ์  ๊ณตํ†ต ํƒ€์ž…"์„ ๊ณ„์‚ฐํ•œ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ๋‹ค.

let x = [0, 1, null];

์œ„ ์˜ˆ์ œ์˜ x ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋ ค๋ฉด ๊ฐ ๋ฐฐ์—ด ์š”์†Œ์˜ ํƒ€์ž…์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐฐ์—ด์˜ ํƒ€์ž…์œผ๋กœ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ํ›„๋ณด๊ฐ€ ์žˆ๋‹ค: number์™€ null์ด๋‹ค.
์ตœ์  ๊ณตํ†ต ํƒ€์ž… ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ ํ›„๋ณด์˜ ํƒ€์ž…์„ ๊ณ ๋ คํ•˜์—ฌ, ๋ชจ๋“  ํ›„๋ณด์˜ ํƒ€์ž…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์„ ํƒํ•œ๋‹ค.


๋ฌธ๋งฅ์ƒ์˜ ํƒ€์ดํ•‘(Contextual Typing)

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋Š” ๋˜ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์€ ๋ฐ”๋กœ ๋ฌธ๋งฅ์ƒ์œผ๋กœ ํƒ€์ž…์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๋ฌธ๋งฅ์ƒ์˜ ํƒ€์ดํ•‘(ํƒ€์ž… ๊ฒฐ์ •)์€ ์ฝ”๋“œ์˜ ์œ„์น˜(๋ฌธ๋งฅ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ผ์–ด๋‚œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

function add(a, b) {
  return a + b;
}

add ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„ ๋”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

์ด ๊ฒฝ์šฐ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ a์™€ b์˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์ถ”๋ก ํ•œ๋‹ค.

๋งŒ์•ฝ ๋งค๊ฐœ๋ณ€์ˆ˜ a์™€ b๊ฐ€ ๋ชจ๋‘ ์ˆซ์ž(Number) ํƒ€์ž…์ด๋ผ๋ฉด,
add ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’๋„ ์ˆซ์ž(Number) ํƒ€์ž…์œผ๋กœ ์ถ”๋ก ๋œ๋‹ค.


ํƒ€์ž… ์ถ”๋ก ์˜ ์žฅ์ 

์ด๋Ÿฐ ํƒ€์ž… ์ถ”๋ก ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ๋‹ค.

  1. ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ: ํƒ€์ž… ์ถ”๋ก ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ์ฝ”๋“œ์—์„œ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  2. ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ: ํƒ€์ž… ์ถ”๋ก ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ TypeScript๊ฐ€ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  3. ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ ์šฉ์ด์„ฑ: ํƒ€์ž… ์ถ”๋ก ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์›Œ์ง„๋‹ค. TypeScript๋Š” ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜์—ฌ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํƒ€์ž… ์ถ”๋ก ์˜ ๋‹จ์ 

๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž… ์ถ”๋ก ์ด ๋Š˜ ์ข‹์€ ๊ฒƒ๋งŒ์€ ์•„๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ๋„ ์žˆ๋‹ค.

  1. ํƒ€์ž… ์ถ”๋ก ์ด ์ž˜๋ชป๋  ๊ฒฝ์šฐ ์ฝ”๋“œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: ํƒ€์ž… ์ถ”๋ก ์€ TypeScript๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”๋ก ์ด ์ž˜๋ชป๋  ๊ฒฝ์šฐ ์ฝ”๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ช…์‹œ์ ์ธ ํƒ€์ž… ์ง€์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ: ํƒ€์ž… ์ถ”๋ก ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ํŠนํžˆ, ๋ณต์žกํ•œ ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” ๋ช…์‹œ์ ์ธ ํƒ€์ž… ์ง€์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ํƒ€์ž… ์ถ”๋ก ์€ TypeScript์˜ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ,
๋•Œ์— ๋”ฐ๋ผ ๋ช…์‹œ์ ์ธ ํƒ€์ž… ์ง€์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.


TypeScript์˜ ํด๋ž˜์Šค(Class)


JavaScript์™€ TypeScript ๋ชจ๋‘ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋ฉฐ, ํด๋ž˜์Šค(class)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ์–ธ์–ด์˜ ํด๋ž˜์Šค๋Š” ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

JavaScript์—์„œ์˜ ํด๋ž˜์Šค(Class)


JavaScript์—์„œ ํด๋ž˜์Šค๋Š” ES6(ECMAScript 2015)์—์„œ ์ฒ˜์Œ ๋„์ž…๋˜์—ˆ๋‹ค.
ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ์ฒด์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ JavaScript ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  greet() {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

์œ„ ์ฝ”๋“œ์—์„œ Person ํด๋ž˜์Šค๋Š” name๊ณผ age ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  greet() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

const person = new Person('Alice', 30);
person.greet(); // "์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ Alice์ด๊ณ , 30์‚ด ์ž…๋‹ˆ๋‹ค."

TypeScript์—์„œ์˜ ํด๋ž˜์Šค(Class)


TypeScript์˜ ํด๋ž˜์Šค๋Š” JavaScript์˜ ํด๋ž˜์Šค์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, TypeScript์—์„œ๋Š” ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ TypeScript์˜ ํด๋ž˜์Šค ์˜ˆ์‹œ์ด๋‹ค.

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): void {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

์œ„ ์ฝ”๋“œ์—์„œ name ์†์„ฑ๊ณผ age ์†์„ฑ์€ ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

์•ฝ๊ฐ„์˜ ์ฐจ์ด์ ์€ TypeScript์—์„œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ, constructor๋ฅผ ์ด์šฉํ•˜์—ฌ
์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฉค๋ฒ„๋“ค์€ ์ „๋ถ€ ์ƒ๋‹จ์—์„œ ์ •์˜๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ contructor ๋‚ด ์ธ์ž๋กœ ๋ฐ›์„ ๋•Œ๋„ ์ •ํ™•ํžˆ ํƒ€์ž…์„ ๋ช…์‹œํ•ด ์ค˜์•ผ ํ•œ๋‹ค.

const person = new Person('Alice', 30);
person.greet(); // "์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ Alice์ด๊ณ , 30์‚ด ์ž…๋‹ˆ๋‹ค."

TypeScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ ์œ„์™€ ๊ฐ™์ด JavaScript์™€ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.


ํด๋ž˜์Šค์™€ ์ƒ์†(Inheritance)

TypeScript์˜ ํด๋ž˜์Šค(class)๋Š” ์ธํ„ฐํŽ˜์ด์Šค(interface)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ
๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ํ™•์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ๋„ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.

class Animal {
    move(distanceInMeters: number): void {
        console.log(`${distanceInMeters}m ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.`);
    }
}

class Dog extends Animal {
    speak(): void {
        console.log("๋ฉ๋ฉ!");
    }
}

const dog = new Dog();
dog.move(10);
dog.speak();

์œ„์˜ ์ฝ”๋“œ์—์„œ Animal์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ Dog๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค.

Dog ํด๋ž˜์Šค๋Š” Animal ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉฐ,
Dog ํด๋ž˜์Šค๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ํ•˜์œ„ํด๋ž˜์Šค(subclasses)๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค.

์—ฌ๊ธฐ์„œ Animal ํด๋ž˜์Šค๋Š” ๊ธฐ์ดˆ ํด๋ž˜์Šค, ์ƒ์œ„ํด๋ž˜์Šค(superclasses)๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.


public, private ํ‚ค์›Œ๋“œ

๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ž˜์Šค ๋‚ด์— ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋Š” ์™ธ๋ถ€๋กœ ๊ณต๊ฐœ๋˜๋Š” ๊ฒƒ์ด ๋””ํดํŠธ ๊ฐ’์ด๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฐœ๋œ๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ๋„ ํ‘œ์‹œํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ public ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

class Person {
  public name: string;
  public age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): void {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

ํ˜น์€ ์™ธ๋ถ€์— ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š์„ ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋‹ค๋ฉด private ํ‚ค์›Œ๋“œ๋กœ ๋ช…์‹œํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

class Person {
  public name: string;
  private age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet(): void {
    console.log(`์•ˆ๋…•ํ•˜์„ธ์š”, ์ œ ์ด๋ฆ„์€ ${this.name}์ด๊ณ , ${this.age}์‚ด ์ž…๋‹ˆ๋‹ค.`);
  }
}

readonly ํ‚ค์›Œ๋“œ

readonly ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
์ฝ๊ธฐ ์ „์šฉ ํ”„๋กœํผํ‹ฐ๋“ค์€ ์„ ์–ธ ๋˜๋Š” ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค.

class Mydog {
    readonly name: string;
    constructor(theName: string) {
        this.name = theName;
    }
}
let spooky = new Mydog("์Šคํ‘ธํ‚ค");
spooky.name = "๋ฉ‹์ง„ ์Šคํ‘ธํ‚ค"; // ์—๋Ÿฌ

์œ„์˜ ์ฝ”๋“œ๋Š” name์ด readonly๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ ๋  ๊ฐ’์„ readonly๋กœ ๋ช…์‹œํ•˜์—ฌ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค.



TypeScript์˜ ์ œ๋„ค๋ฆญ(Generic)


ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์ œ๋„ค๋ฆญ(Generic)์€ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์‚ฌ์šฉ๋  ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ,
์ดํ›„์— ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๊ฒŒ ๋œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

์ œ๋„ค๋ฆญ์˜ ํ•„์š”์„ฑ


function printLog(text) {
	return text;
}

์œ„์˜ printLog ํ•จ์ˆ˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ text๋ฅผ ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ, ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ text๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋‹ค.
์ด๋ฅผ ์ œ๋„ค๋ฆญ ์—†์ด ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

function printLog(text: string): string {
	return text;
}

printLog('hello'); // ์ •์ƒ
printLog(123); //์—๋Ÿฌ

์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” printLog ํ•จ์ˆ˜์— ํŠน์ • ํƒ€์ž…์„ ์ฃผ์–ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ด๋‹ค.
ํƒ€์ž…์€ ๋ช…์‹œ๋˜์—ˆ์ง€๋งŒ, string ํƒ€์ž… ์™ธ์— ๋‹ค๋ฅธ ํƒ€์ž…์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ค‘๋ณต์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

function printLog(text: string): string {
	return text;
}

function printLogNumber(text: number): number {
	return text;
}

printLog('hello'); // ์ •์ƒ
printLogNumber(123); //์ •์ƒ

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์€ ํƒ€์ž…์˜ ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋‚˜๋น ์ง„๋‹ค.
ํƒ€์ž…์„ ๋‹ค๋ฅด๊ฒŒ ๋ฐ›๊ธฐ ์œ„ํ•ด ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํƒ€์ž…๋งŒ ๋ฐ”๊ฟ”์„œ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜๋Š” | ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ์œ ๋‹ˆ์˜จ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

function printLog(text: string | number) {
	return text;
}

printLog('hello'); // ์ •์ƒ
printLogNumber(123); //์ •์ƒ

์ด ๋ฐฉ๋ฒ•์€ ๋“ค์–ด๊ฐ€๋Š” ์ธ์ˆ˜๋Š” ํ•ด๊ฒฐ์ด ๋˜์ง€๋งŒ, ํ•จ์ˆ˜ ๋‚ด์—์„œ string๊ณผ number๊ฐ€ ๋‘˜ ๋‹ค ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” API๋งŒ ์ œ๊ณตํ•œ๋‹ค.
์ด ์™ธ์—๋Š” ํƒ€์ž…์ด ์ •ํ™•ํžˆ ์ถ”๋ก ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ด์–ด any ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ด๋‹ค.

function printLog(text: any): any {
	return text;
}

์ด ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ํƒ€์ž…์ด๋“  ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ํ•„์š”์„ฑ์ด ์ƒ๊ธด๋‹ค.


์ œ๋„ค๋ฆญ


์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

function printLog<T>(text: T): T {
	return text;
}

printLog ํ•จ์ˆ˜์— T๋ผ๋Š” ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

T๋Š” ์œ ์ €๊ฐ€ ์ค€ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์„ ์บก์ฒ˜ํ•˜๊ณ , ์ด ์ •๋ณด๋ฅผ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
์—ฌ๊ธฐ์—์„œ๋Š” T๋ฅผ ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ ๋‹ค์‹œ ์‚ฌ์šฉํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ๊ฐ™์€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

printLog ํ•จ์ˆ˜๋Š” ํƒ€์ž…์„ ๋ถˆ๋ฌธํ•˜๊ณ  ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ œ๋„ค๋ฆญ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

any๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธ์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์— string์„ ์‚ฌ์šฉํ•œ
์ฒซ ๋ฒˆ์งธ printLog ํ•จ์ˆ˜๋งŒํผ ์ •ํ™•ํ•˜๋‹ค. ์ฆ‰ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ œ๋„ค๋ฆญ์„ ์ž‘์„ฑํ•˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

const str = printLog<string>('hello');

์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์˜ ์ธ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋กœ์จ T๋ฅผ string ํƒ€์ž…์œผ๋กœ
๋ช…์‹œํ•ด ์ฃผ๊ณ  ํƒ€์ž… ์ฃผ๋ณ€์„ <>๋กœ ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค.

ํ˜น์€ ํƒ€์ž… ์ถ”๋ก  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

const str = printLog('hello');

์ด๋Š” ํƒ€์ž… ์ถ”๋ก  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ด๋‹ค.
์ „๋‹ฌํ•˜๋Š” ์ธ์ˆ˜์— ๋”ฐ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ T์˜ ๊ฐ’์„ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๋Š” ํƒ€์ž…์ด ๋ณต์žกํ•ด์ ธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.


์ธํ„ฐํŽ˜์ด์Šค์™€ ์ œ๋„ค๋ฆญ


์ธํ„ฐํŽ˜์ด์Šค์—๋„ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

interface Item<T> {
	name: T;
	stock: number;
	selected: boolean;
}

์ด์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด Item ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด๋Š” name์˜ ๊ฐ’์œผ๋กœ ์–ด๋–ค ํƒ€์ž…์ด
๋“ค์–ด๊ฐˆ์ง€๋งŒ ์ž‘์„ฑ์„ ํ•ด์ฃผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ์žฌ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

const obj: Item<string> = { 
	name: "T-shirts",
	stock: 2, 
	selected: false
};

const obj: Item<number> = { 
	name: 2044512,
	stock: 2, 
	selected: false
};

์ด๋Ÿฐ ์‹์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.


ํด๋ž˜์Šค์™€ ์ œ๋„ค๋ฆญ


์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” TypeScript์—์„œ ํŒฉํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํด๋ž˜์Šค ํƒ€์ž…์„ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค.

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

์ด๊ฒƒ์€ GenericNumber ํด๋ž˜์Šค์˜ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ number ํƒ€์ž…๋งŒ ์“ฐ๋„๋ก ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์—†๋‹ค.
๋Œ€์‹  string์ด๋‚˜ ํ›จ์”ฌ ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์ œ๋„ค๋ฆญ ํƒ€์ž… ๋ณ€์ˆ˜


์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, printLog์™€ ๊ฐ™์€ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ,
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์— ์ œ๋„ค๋ฆญ ํƒ€์ž…ํ™”๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์“ฐ๋„๋ก ๊ฐ•์š”ํ•œ๋‹ค.

์•ž์„œ ๋ณธ printLog ํ•จ์ˆ˜๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด๊ฒ ๋‹ค.

function printLog<T>(text: T): T {
	console.log(text.length);
	return text;
}

์œ„์™€ ๊ฐ™์ด console.log(text.length);๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ string ํƒ€์ž…์ด ์•„๋‹Œ number ํƒ€์ž…์„ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
T์—๋Š” .length๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ถ”๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋•Œ๋Š” ์ œ๋„ค๋ฆญ์— ํƒ€์ž…์„ ์ค˜์„œ ์œ ์—ฐํ•˜๊ฒŒ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์ •์˜ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

function printLog<T>(text: T[]): T[] {
	console.log(text.length);
	return text;
}

์ด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜ ์ฝ”๋“œ๋Š” ์ผ๋‹จ T๋ผ๋Š” ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๋ฐ›๊ณ , ์ธ์ž ๊ฐ’์œผ๋กœ๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ์˜ T๋ฅผ ๋ฐ›๋Š”๋‹ค.
๋”ฐ๋ผ์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, .length๋ฅผ ํ—ˆ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

ํ˜น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กฐ๊ธˆ ๋” ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

function printLog<T>(text: Array<T>): Array<T> {
	console.log(text.length);
	return text;
}

์ œ๋„ค๋ฆญ ์ œ์•ฝ ์กฐ๊ฑด


์•ž์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋ณ€์ˆ˜ ์™ธ์—๋„ ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์— ์–ด๋Š ์ •๋„ ์–ด๋–ค ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ ๊ฒƒ์ธ์ง€ ํžŒํŠธ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์‹œ ์•ž์„œ ๋ณธ printLog ํ•จ์ˆ˜๋ฅผ ์˜ˆ์‹œ๋กœ ๋ณด๊ฒ ๋‹ค.

function printLog<T>(text: T): T {
	console.log(text.length);
	return text;
}

์ธ์ž์˜ ํƒ€์ž…์— ์„ ์–ธํ•œ T๋Š” ์•„์ง ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— length ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

์ด๋Ÿด ๋•Œ ๋งŒ์•ฝ ํ•ด๋‹น ํƒ€์ž…์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ๋„ length ์†์„ฑ ์ •๋„๋Š” ํ—ˆ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

interface TextLength {
	length: number;
}

function printLog<T extends TextLength>(text: T): T {
	console.log(text.length);
	return text;
}

์ด์™€ ๊ฐ™์ด extends ์ง€์‹œ์ž๋ฅผ ์ด์šฉํ•ด ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ํƒ€์ž…์— ๋Œ€ํ•œ
๊ฐ•์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ length์— ๋Œ€ํ•ด ๋™์ž‘ํ•˜๋Š” ์ธ์ž๋งŒ ๋„˜๊ฒจ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ˜น์€ keyof๋ฅผ ์ด์šฉํ•ด์„œ ์ œ์•ฝ์„ ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

interface Item<T> {
	name: T;
	stock: number;
	selected: boolean;
}

function printLog<T extends keyof Item>(text: T): T {
	return text;
}

printLog('name'); //์ •์ƒ
pirntLog('key'); //์—๋Ÿฌ

์ œ๋„ค๋ฆญ์„ ์„ ์–ธํ•  ๋•Œ <T extends keyof Item> ๋ถ€๋ถ„์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ
๋ฐ›๋Š” ๊ฐ์ฒด์— ์—†๋Š” ์†์„ฑ๋“ค์€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ๋” ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.



๐Ÿ’ฌ Sprint Review


์ด๋ฒˆ ๊ณผ์ œ๋Š” ์ด๋ฒˆ ์œ ๋‹›์—์„œ ํŠœํ† ๋ฆฌ์–ผ๋กœ ์‹ค์Šตํ–ˆ๋˜ ๋Œ€๋กœ JavaScript ์–ธ์–ด๋กœ ๋งŒ๋“ค์–ด์ง„ React App์˜ ํ™˜๊ฒฝ์„ TypeScript ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด ๋ณด๊ณ , JavaScript ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ TypeScript ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ํŽ˜์–ด์™€ ํ•จ๊ป˜ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ์‹ค๋ฌด์—์„œ๋Š” ์กด์žฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•ด ๋ณด๊ณ ,
๊ธฐ์กด์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋˜ ์–ธ์–ด๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”ฅ Bare Minimum Requirements


์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ข…ํ•ฉํ•˜์—ฌ JavaScript ํ™˜๊ฒฝ์—์„œ ์ž‘์„ฑ๋œ, React App์„ TypeScript ํ™˜๊ฒฝ์—์„œ ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค.

TypeScript ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ

  • npm์„ ํ†ตํ•ด TypeScript ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ์— tsconfig.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค, compilerOptions, include, exclude ๋“ฑ์˜ ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ TypeScript ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ƒ์„ธ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

  • ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๋Š”

    • index.js
    • App.js
    • Todo.js
    • TodoForm.js ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ด๋“ค์˜ ์ด๋ฆ„์„

    • index.tsx
    • App.tsx
    • Todo.tsx
    • TodoForm.tsx ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  TypeScript ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•ด ๋ด…๋‹ˆ๋‹ค.


๐Ÿ’ฌ Review





profile
์•„์ด๋””์–ด๊ฐ€ ๋„˜์น˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ฟˆ๊ฟ‰๋‹ˆ๋‹ค ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€