๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐Ÿค Chapter 1: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์•Œ์•„๋ณด๊ธฐ

๐Ÿฅ• ์•„์ดํ…œ 1. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ด€๊ณ„ ์ดํ•ดํ•˜๊ธฐโ€‹

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฌธ๋ฒ•์ ์œผ๋กœ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์œ„์ง‘ํ•ฉ(superset)์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์— ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค๋ฉด, ์œ ํšจํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์œ„์ง‘ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— .js ํŒŒ์ผ์— ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์ด๋ฏธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. main.js ํŒŒ์ผ๋ช…์„ main.ts๋กœ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด๋„ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ผ๋Š” ๋ช…์ œ๋Š” ์ฐธ์ด์ง€๋งŒ, ๊ทธ ๋ฐ˜๋Œ€๋Š” ์„ฑ๋ฆฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์ด์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ๊ทธ๋žจ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

function greet(who: string) {
console.log('hello', who);
}

๊ทธ๋Ÿฌ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋…ธ๋“œ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์•ž์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
ํƒ€์ž… ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์˜์—ญ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ๋Ÿฐํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ "์ •์ " ํƒ€์ž… ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ด๋Ÿฐ ํŠน์ง•์„ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํƒ€์ž… ๊ตฌ๋ฌธ ์—†์ด๋„ ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ํƒ€์ž… ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ "์˜๋„"๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํƒ€์ž… ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์— ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๋™์ž‘๊ณผ ์˜๋„๊ฐ€ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

const x = 2 + '3'; // ์ •์ƒ, string ํƒ€์ž…์ž…๋‹ˆ๋‹ค.
const y = '2' + 3; // ์ •์ƒ, string ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜€๋‹ค๋ฉด ๋Ÿฐํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋  ๋งŒํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์ฒด์ปค๋Š” ์ •์ƒ์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ค„ ๋ชจ๋‘ ๋ฌธ์ž์—ด "23"์ด ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์œผ๋กœ ๋ชจ๋ธ๋ง๋ฉ๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์— ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์ธ๋ฐ, ํƒ€์ž… ์ฒด์ปค๋Š” ๋ฌธ์ œ์ ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

const a = null + 7;
const b = [] + 12;
alert('hello', 'TypeScript');

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

์•ž์„œ ๋“ฑ์žฅํ•œ ์˜ค๋ฅ˜๋“ค์ด ๋ฐœ์ƒํ•˜๋Š” ๊ทผ๋ณธ ์›์ธ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…๊ณผ ์‹ค์ œ ๊ฐ’์— ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํƒ€์ž… ์‹œ์Šคํ…œ์ด ์ •์  ํƒ€์ž…์˜ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•ด ์ค„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ํƒ€์ž… ์‹œ์Šคํ…œ์€ ๊ทธ๋Ÿฐ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 2. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ • ์ดํ•ดํ•˜๊ธฐโ€‹

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์„ค์ •๋“ค์€ ์–ด๋””์„œ ์†Œ์Šค ํŒŒ์ผ์„ ์ฐพ์„์ง€, ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ• ์ง€ ์ œ์–ดํ•˜๋Š” ๋‚ด์šฉ์ด ๋Œ€๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์„ค์ •์„ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, noImplicitAny์™€ strictNullChecks๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
noImplicitAny๋Š” ๋ณ€์ˆ˜๋“ค์ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ํƒ€์ž…์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋Š” noImplicitAny๊ฐ€ ํ•ด์ œ๋˜์–ด ์žˆ์„ ๋•Œ์—๋Š” ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

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

ํŽธ์ง‘๊ธฐ์—์„œ add ๋ถ€๋ถ„์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ ค ๋ณด๋ฉด, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถ”๋ก ํ•œ ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function add(a: any, b: any): any

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

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

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

strictNullChecks๋Š” null๊ณผ undefined๊ฐ€ ๋ชจ๋“  ํƒ€์ž…์—์„œ ํ—ˆ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

const x: number = null; // ์ •์ƒ, null์€ ์œ ํšจํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ strictNullChecks๋ฅผ ์„ค์ •ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

const x: number = null; // error

null ๋Œ€์‹  undefined๋ฅผ ์จ๋„ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ null์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ์˜๋„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋ƒ„์œผ๋กœ์จ ์˜ค๋ฅ˜๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const x: number | null = null;

strictNullChecks๋Š” null๊ณผ undefined ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ด๋Š” ๋ฐ ๋งŽ์€ ๋„์›€์ด ๋˜์ง€๋งŒ, ์ฝ”๋“œ ์ž‘์„ฑ์„ ์–ด๋ ต๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ๊ฐ€๊ธ‰์  strictNullChecks๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฒ˜์Œ์ด๊ฑฐ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ค‘์ด๋ผ๋ฉด ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
strictNullChecks๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด noImplicitAny๋ฅผ ๋จผ์ € ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฑฐ๋Œ€ํ•ด์งˆ์ˆ˜๋ก ์„ค์ • ๋ณ€๊ฒฝ์€ ์–ด๋ ค์›Œ์งˆ ๊ฒƒ์ด๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•œ ํ•œ ์ดˆ๋ฐ˜์— ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿฅ• ์•„์ดํ…œ 3. ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํƒ€์ž…์ด ๊ด€๊ณ„์—†์Œ์„ ์ดํ•ดํ•˜๊ธฐโ€‹

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‘ ๊ฐ€์ง€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ตœ์‹  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๋ฒ„์ „์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์˜ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์ฝ”๋“œ ๋‚ด์˜ ํƒ€์ž…์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ์‹œ์ ์—๋„ ํƒ€์ž…์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋„ ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹คโ€‹

์ปดํŒŒ์ผ์€ ํƒ€์ž… ์ฒดํฌ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋„ ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜๋Š” C๋‚˜ ์ž๋ฐ” ๊ฐ™์€ ์–ธ์–ด๋“ค์˜ ๊ฒฝ๊ณ ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋  ๋งŒํ•œ ๋ถ€๋ถ„์„ ์•Œ๋ ค ์ฃผ์ง€๋งŒ, ๊ทธ๋ ‡๋‹ค๊ณ  ๋นŒ๋“œ๋ฅผ ๋ฉˆ์ถ”์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ๋•Œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด, tsconfig.json์— noEmitOnError๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋นŒ๋“œ ๋„๊ตฌ์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„์—๋Š” ํƒ€์ž… ์ฒดํฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.โ€‹

๋‹ค์Œ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

interface Square {
width: number;
}
interface Rectangle extends Square {
height: number;
}
type Shape = Square | Rectangle;

function calculateArea(shape: Shape) {
if (shape instanceof Rectangle) {
// ~~~~~ "Rectangle"์€ ํ˜•์‹๋งŒ ์ฐธ์กฐํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
return shape.width * shape.height;
// ~~~~~ "Shape" ํ˜•์‹์— "height" ์†์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
} else {
return shape.width * shape.width;
}
}

instanceof ์ฒดํฌ๋Š” ๋Ÿฐํ‹ฐ์ž„์— ์ผ์–ด๋‚˜์ง€๋งŒ, Rectangle์€ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์•„๋ฌด๋Ÿฐ ์—ญํ• ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์€ ์ œ๊ฑฐ ๊ฐ€๋Šฅ(erasable)ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๊ณผ์ •์—์„œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค, ํƒ€์ž…, ํƒ€์ž… ๊ตฌ๋ฌธ์€ ๊ทธ๋ƒฅ ์ œ๊ฑฐ๋˜์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
์•ž์˜ ์ฝ”๋“œ์—์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ๋Š” shape ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์€ height ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ์ฒดํฌํ•ด ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

function calculateArea(shape: Shape) {
if ('height' in shape) {
shape; // ํƒ€์ž…์ด Rectangle
return shape.width * shape.height;
} else {
shape; // ํƒ€์ž…์ด Square
return shape.width * shape.width;
}
}

ํƒ€์ž… ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋Ÿฐํƒ€์ž„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํƒ€์ž… ์ •๋ณด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” 'ํƒœ๊ทธ' ๊ธฐ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

interface Square {
kind: 'square';
width: number;
}
interface Rectangle {
kind: 'rectangle';
height: number;
width: number;
}
type Shape = Square | Rectangle;

function calculateArea(shape: Shape) {
if (shape.kind === 'rectangle') {
shape; // ํƒ€์ž…์ด Rectangle
return shape.width * shape.height;
} else {
shape; // ํƒ€์ž…์ด Square
return shape.width * shape.width;
}
}

์ด ๊ธฐ๋ฒ•์€ ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์†์‰ฝ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํ”ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…(๋Ÿฐํƒ€์ž„ ์ ‘๊ทผ ๋ถˆ๊ฐ€)๊ณผ ๊ฐ’(๋Ÿฐํƒ€์ž„ ์ ‘๊ทผ ๊ฐ€๋Šฅ)์„ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

class Square {
constructor(public width: number) {}
}
class Rectangle extends Square {
constructor(public width: number, public height: number) {
super(width);
}
}
type Shape = Square | Rectangle;

function calculateArea(shape: Shape) {
if (shape instanceof Rectangle) {
shape; // ํƒ€์ž…์ด Rectangle
return shape.width * shape.height;
} else {
shape; // ํƒ€์ž…์ด Square
return shape.width * shape.width;
}
}

์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์œผ๋กœ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, Rectangle์„ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜๋ฉด ํƒ€์ž…๊ณผ ๊ฐ’์œผ๋กœ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํƒ€์ž… ์—ฐ์‚ฐ์€ ๋Ÿฐํƒ€์ž„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹คโ€‹

๊ฐ’์„ ์ •์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋Ÿฐํƒ€์ž„์˜ ํƒ€์ž…์„ ์ฒดํฌํ•ด์•ผ ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

function asNumber(val: number | string): number {
return typeof(val) === 'string' ? Number(val) : val;
}

๋Ÿฐํƒ€์ž„ ํƒ€์ž„์€ ์„ ์–ธ๋œ ํƒ€์ž„๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ€‹

function setLightSwitch(value: boolean) {
switch (value) {
case true:
turnLightOn();
break;
case false:
turnLightOff();
break;
default:
console.log('์‹คํ–‰๋˜์ง€ ์•Š์„๊นŒ ๋ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.');
}
}

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ๋ชปํ•˜๋Š” ์ฃฝ์€ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋‚ด์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” strict๋ฅผ ์„ค์ •ํ•˜๋”๋ผ๋„ ์ฐพ์•„๋‚ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? boolean์ด ํƒ€์ž… ์„ ์–ธ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— boolean์€ ๋Ÿฐํƒ€์ž„์— ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜€๋‹ค๋ฉด ์‹ค์ˆ˜๋กœ setLightSwitch "ON"์„ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

interface LightApiResponse {
lightSwitchValue: boolean;
}
async function setLight() {
const response = await fetch('/light');
const result: LightApiResponse = await response.json();
setLightSwitch(result.lightSwitchValue);
}

/light๋ฅผ ์š”์ฒญํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋กœ LightApiResponse๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ผ๊ณ  ์„ ์–ธํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋Ÿฐํƒ€์ž„ ํƒ€์ž…๊ณผ ์„ ์–ธ๋œ ํƒ€์ž…์ด ๋งž์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์ด ๋‹ฌ๋ผ์ง€๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ์ƒํ™ฉ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ๋œ ํƒ€์ž…์ด ์–ธ์ œ๋“ ์ง€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์œผ๋กœ๋Š” ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.โ€‹

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

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

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

function add(a: number, b: number): number;
function add(a: string, b: string): string;

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

const three = add(1, 2);
const twelve = add('1', '2');

add์— ๋Œ€ํ•œ ์ฒ˜์Œ ๋‘ ๊ฐœ์˜ ์„ ์–ธ๋ฌธ์€ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ๋‘ ์„ ์–ธ๋ฌธ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜๋˜๋ฉด์„œ ์ œ๊ฑฐ๋˜๋ฉฐ, ๊ตฌํ˜„์ฒด๋งŒ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž…์€ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹คโ€‹

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

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

๐Ÿฅ• ์•„์ดํ…œ 4. ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์— ์ต์ˆ™ํ•ด์ง€๊ธฐโ€‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋• ํƒ€์ดํ•‘ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด ๋ชจ๋‘ ์ œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค๋ฉด, ๊ทธ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋Ÿฐ ๋™์ž‘, ์ฆ‰ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•œ๋‹ค๋ฉด ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๋™์ž‘์„ ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค.

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

๋ฌผ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ 2D ๋ฒกํ„ฐ ํƒ€์ž…์„ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

interface Vector2D {
x: number;
y: number;
}

๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function calculateLength(v: Vector2D) {
return Math.sqrt(v.x * v.x + v.y * v.y);
}

์ด์ œ ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ„ ๋ฒกํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

interface NamedVector {
name: string;
x: number;
y: number;
}

NamedVector๋Š” number ํƒ€์ž…์˜ x์™€ y์†์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— calculateLength ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ์˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

const v: NamedVector = { x: 3, y: 4, name: 'Zee' };
calculateLength(v);

ํฅ๋ฏธ๋กœ์šด ์ ์€ Vector2D์™€ NamedVector์˜ ๊ด€๊ณ„๋ฅผ ์ „ํ˜€ ์„ ์–ธํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  NamedVector๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ calculateLength๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค. NamedVector์˜ ๊ตฌ์กฐ๊ฐ€ Vector2D์™€ ํ˜ธํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— calculateLength ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "๊ตฌ์กฐ์  ํƒ€์ดํ•‘(structural typing)"์ด๋ผ๋Š” ์šฉ์–ด๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์  ํƒ€์ดํ•‘ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

interface Vector3D {
x: number;
y: number;
z: number;
}

๊ทธ๋ฆฌ๊ณ  ๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ 1๋กœ ๋งŒ๋“œ๋Š” ์ •๊ทœํ™” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

function normalize(v: Vector3D) {
const length = calculateLength(v);

return {
x: v.x / length,
y: v.y / length,
z: v.z / length,
};
}

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•จ์ˆ˜๋Š” 1๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ธด(1.41) ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

normalize({ x: 3, y: 4, z: 5});
// { x: 0.6, y: 0.8, z: 1 }

calculateLength๋Š” 2D ๋ฒกํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ์‚ฐํ•˜๋Š”๋ฐ, ๋ฒ„๊ทธ๋กœ ์ธํ•ด normalize๊ฐ€ 3D ๋ฒกํ„ฐ๋กœ ์—ฐ์‚ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. z๊ฐ€ ์ •๊ทœํ™”์—์„œ ๋ฌด์‹œ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํƒ€์ž… ์ฒด์ปค๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ์žก์•„๋‚ด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. calculateLength๊ฐ€ 2D ๋ฒกํ„ฐ๋ฅผ ๋ฐ›๋„๋ก ์„ ์–ธ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  3D ๋ฒกํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋˜ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

Vector3D์™€ ํ˜ธํ™˜๋˜๋Š” { x, y, z } ๊ฐ์ฒด๋กœ calculateLength๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๊ตฌ์กฐ์  ํƒ€์ดํ•‘ ๊ด€์ ์—์„œ x, y๊ฐ€ ์žˆ์–ด์„œ Vector2D์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๊ณ , ํƒ€์ž… ์ฒด์ปค๊ฐ€ ๋ฌธ์ œ๋กœ ์ธ์‹ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์•„์ดํ…œ 37 ์ฐธ๊ณ )

ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์†์„ฑ๋“ค์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์— ์„ ์–ธ๋œ ์†์„ฑ๋งŒ์„ ๊ฐ€์งˆ ๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒ€์ž…์€ "๋ด‰์ธ๋œ" ๋˜๋Š” "์ •ํ™•ํ•œ" ํƒ€์ž…์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ์‹œ์Šคํ…œ์—์„œ๋Š” ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ข‹๋“  ์‹ซ๋“  ํƒ€์ž…์€ "์—ด๋ ค"์žˆ์Šต๋‹ˆ๋‹ค. (ํƒ€์ž…์˜ ํ™•์žฅ์— ์—ด๋ ค ์žˆ๋‹ค)

ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋–„๋Š” ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

interface Author {
first: string;
last: string;
}

function getAuthors(database: PostgresDB): Author[] {
const authorRows = database.runQuery(`SELECT FIRST, LAST FROM AUTHORS`);
return authorRows.map((row) => ({ first: row[], last: row[1] }));
}

getAuthors ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจํ‚นํ•œ PostgresDB๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์กฐ์  ํƒ€์ดํ•‘์„ ํ™œ์šฉํ•˜์—ฌ ๋” ๊ตฌ์ฒด์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

interface DB {
runQuery: (sql: string) => any[];
}

function getAuthors(database: DB): Author[] {
const authorRows = database.runQuery(`SELECT FIRST, LAST FROM AUTHORS`);
return authorRows.map((row) => ({ first: row[], last: row[1] }));
}

runQuery ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋„ getAuthors์— PostgresDB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ์  ํƒ€์ดํ•‘ ๋•๋ถ„์—, PostgresDB๊ฐ€ DB ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋” ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

test('getAuthors', () => {
const authors = getAuthors({
runQuery(sql: string) {
return [['Toni', 'Morrison'], ['Maya', 'Angelou']];
}
});

expect(authors).toEqual([
{ first: 'Toni', last: 'Morrison' },
{ first: 'Maya', last: 'Angelou' },
]);
});

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

๐Ÿฅ• ์•„์ดํ…œ 5. any ํƒ€์ž… ์ง€์–‘ํ•˜๊ธฐโ€‹

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

let age: number;
age = '12'; // ํ˜•์‹์€ number์ด๊ธฐ ๋•Œ๋ฌธ์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
age = '12' as any; // OK

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

any ํƒ€์ž…์—๋Š” ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.โ€‹

ํƒ€์ž… ์ฒด๊ฑฐ๋Š” ์„ ์–ธ์— ๋”ฐ๋ผ number ํƒ€์ž…์œผ๋กœ ํŒ๋‹จํ•  ๊ฒƒ์ด๊ณ  ํ˜ผ๋ˆ์€ ๊ฑท์žก์„ ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

age += 1; // ๋Ÿฐํƒ€์ž„์— ์ •์ƒ, age๋Š” "121"

any๋Š” ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋ฌด์‹œํ•ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.โ€‹

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

function calculateAge(birthDate: Date): number {
// ...
}

let birthDate: any = '1990-01-19';
calculateAge(birthDate); // ์ •์ƒ

anyํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด calculateAge์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋ฌด์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

anyํƒ€์ž…์—๋Š” ์–ธ์–ด ์„œ๋น„์Šค๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.โ€‹

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

anyํƒ€์ž…์€ ์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง ๋•Œ ๋ฒ„๊ทธ๋ฅผ ๊ฐ์ถฅ๋‹ˆ๋‹ค.โ€‹

์–ด๋–ค ์•„์ดํ…œ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

interface ComponentProps {
onSelectItem: (item: any) => void;
}

๋‹ค์Œ๊ณผ ๊ฐ™์ด onSelectItem ์ฝœ๋ฐฑ์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋„ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

function renderSelector(props: ComponentProps) { /* ... */ }

let selectedId: number = 0;

function handleSelectItem(item: any) {
selectedId = item.id;
}

renderSelector({ onSelectItem: handleSelectItem });

onSelectItem์— ์•„์ดํ…œ ๊ฐ์ฒด๋ฅผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ „๋‹ฌํ•˜๋„๋ก ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ์„ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” id๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ComponentProps์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

interface ComponentProps {
onSelectItem: (id: number) => void;
}

handleSelectItem์€ any ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ id๋ฅผ ์ „๋‹ฌ๋ฐ›์•„๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ๋‚˜์˜ต๋‹ˆ๋‹ค. id๋ฅผ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด, ํƒ€์ž… ์ฒด์ปค๋ฅผ ํ†ต๊ณผํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์—๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒ๋‹ˆ๋‹ค. any๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด, ํƒ€์ž… ์ฒด์ปค๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์„ ๊ฒ๋‹ˆ๋‹ค.

any๋Š” ํƒ€์ž… ์„ค๊ณ„๋ฅผ ๊ฐ์ถฐ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.โ€‹

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

any๋Š” ํƒ€์ž…์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐ๋„๋ฅผ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค.โ€‹

์‚ฌ๋žŒ์€ ํ•ญ์ƒ ์‹ค์ˆ˜๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ํƒ€์ž… ์ฒด์ปค๊ฐ€ ์‹ค์ˆ˜๋ฅผ ์žก์•„์ฃผ๊ณ  ์ฝ”๋“œ์˜ ์‹ ๋ขฐ๋„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์— ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํƒ€์ž… ์ฒด์ปค๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์„ ๊ฒ๋‹ˆ๋‹ค. any ํƒ€์ž…์„ ์“ฐ์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„์— ๋ฐœ๊ฒฌ๋  ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ๊ณ  ์‹ ๋ขฐ๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.