Among Us - Crewmates
 

__[TypeScript] 01. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ด€๊ณ„ ์ดํ•ดํ•˜๊ธฐ__

728x90

etc-image-0
๐Ÿ“š Effective TypeScript ์ฑ…์„ ์ฝ๊ณ  ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์œ„์ง‘ํ•ฉ(superset)์ด๋‹ค

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ด€๊ณ„

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

๋ฌธ๋ฒ•์˜ ์œ ํšจ์„ฑ๊ณผ ๋™์ž‘์˜ ์ด์Šˆ๋Š” ๋…๋ฆฝ์ ์ธ ๋ฌธ์ œ

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

ํ™•์žฅ์ž์˜ ์ฐจ์ด

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ .js ๋˜๋Š” .jsx ํ™•์žฅ์ž
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ .ts ๋˜๋Š” .tsx ํ™•์žฅ์ž
  • ํ•˜์ง€๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒ์œ„์ง‘ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— main.js๋ฅผ main.ts๋กœ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด๋„ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์—†๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ์—„์ฒญ๋‚œ ์ด์ 
    • ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ์ผ๋ถ€๋ถ„์—๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ

๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ

  • ์œ„ ๋ช…์ œ๋Š” ์ฐธ์ด์ง€๋งŒ, ๋ฐ˜๋Œ€๋Š” ์„ฑ๋ฆฝํ•˜์ง€ X
    • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ์œ ํšจํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ
function greet(who: string) {
    console.log('Hello', who);
}
TypeError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
let city = 'new york city';
console.log(city.toUppercase());

ํ•˜์ง€๋งŒ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž…์ฒด์ปค๋Š” ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

  • toUppercase ์†์„ฑ์ด 'string' ํ˜•์‹์— ์—†์Šต๋‹ˆ๋‹ค.
let city = 'new york city';
console.log(city.toUppercase());
              // ~~~~~~~~~~~ Property 'toUppercase' does not exist on type
              //             'string'. Did you mean 'toUpperCase'?

์ฆ‰, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ดˆ๊นƒ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ํƒ€์ž…์„ ์ถ”๋ก ํ•œ๋‹ค.

ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๋ชฉํ‘œ

ํƒ€์ž… ์‹œ์Šคํ…œ์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š”, ๋Ÿฐํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ '์ •์ ' ํƒ€์ž… ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ํŠน์ง•

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ
const states = [
  {name: 'Alabama', capital: 'Montgomery'},
  {name: 'Alaska',  capital: 'Juneau'},
  {name: 'Arizona', capital: 'Phoenix'},
// ...
];
for (const state of states) {
  console.log(state.capitol);
}
์‹คํ–‰๊ฒฐ๊ณผ

undefined
undefined
undefined
  • ์œ ํšจํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ด๋ฉฐ ์˜ค๋ฅ˜ ์—†์ด ์‹คํ–‰๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ, ๋ฃจํ”„ ๋‚ด์˜ state.capitol ์€ ์˜๋„ํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹˜
    • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ์ฒด์ปค๋Š” ์ถ”๊ฐ€์ ์ธ ํƒ€์ž… ๊ตฌ๋ฌธ์ด ์—†์–ด๋„ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

// HIDE
export const foo = true;
const states = [
  {name: 'Alabama', capital: 'Montgomery'},
  {name: 'Alaska',  capital: 'Juneau'},
  {name: 'Arizona', capital: 'Phoenix'},
// ...
];
// ENDfor (const state of states) {
  console.log(state.capitol);
// ~~~~~~~ Property 'capitol' does not exist on type//         '{ name: string; capital: string; }'.//         Did you mean 'capital'?
}
  • ์ด์ฒ˜๋Ÿผ ํƒ€์ž… ๊ตฌ๋ฌธ ์—†์ด๋„ ์˜ค๋ฅ˜๋ฅผ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.
  • ํƒ€์ž… ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

const states = [
  {name: 'Alabama', capitol: 'Montgomery'},
  {name: 'Alaska',  capitol: 'Juneau'},
  {name: 'Arizona', capitol: 'Phoenix'},
// ...
];
for (const state of states) {
  console.log(state.capital);
// ~~~~~~~ Property 'capital' does not exist on type//         '{ name: string; capitol: string; }'.//         Did you mean 'capitol'?
}
  • ํ•˜์ง€๋งŒ ์ด์ฒ˜๋Ÿผ ์–ด๋Š์ชฝ์ด ์˜คํƒ€์ธ์ง€ ํŒ๋‹จํ•˜์ง€ ๋ชปํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ช…์‹œ์ ์œผ๋กœ states๋ฅผ ์„ ์–ธํ•ด์„œ ์˜๋„๋ฅผ ๋ถ„๋ช…ํžˆ ํ•ด์•ผํ•œ๋‹ค.

์˜ค๋ฅ˜๋ฐœ์ƒ ์ง€์ ๋„ ์˜ฌ๋ฐ”๋ฅด๊ณ , ์ œ์‹œ๋œ ํ•ด๊ฒฐ์ฑ…๋„ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ
interface State {
  name: string;
  capital: string;
}
const states: State[] = [
  {name: 'Alabama', capitol: 'Montgomery'},
// ~~~~~~~~~~~~~~~~~~~~~
  {name: 'Alaska',  capitol: 'Juneau'},
// ~~~~~~~~~~~~~~~~~
  {name: 'Arizona', capitol: 'Phoenix'},
// ~~~~~~~~~~~~~~~~~~ Object literal may only specify known//         properties, but 'capitol' does not exist in type//         'State'.  Did you mean to write 'capital'?// ...
];
for (const state of states) {
  console.log(state.capital);
}
  • ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž ์žฌ์  ๋ฌธ์ œ์ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.
// HIDE
export const foo = true;
interface State {
  name: string;
  capital: string;
}
// END

const states: State[] = [
  {name: 'Alabama', capital: 'Montgomery'},
  {name: 'Alaska',  capitol: 'Juneau'},
// ~~~~~~~~~~~~~~~~~ Did you mean to write 'capital'?
  {name: 'Arizona', capital: 'Phoenix'},
// ...
];
  • ํƒ€์ž… ๊ตฌ๋ฌธ ์—†์ด ๋ฐฐ์—ด ์•ˆ์—์„œ ๋”ฑ ํ•œ ๋ฒˆ capitol์ด๋ผ๊ณ  ์ผ๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋˜์ง€ ์•Š์Œ
    • ๊ทธ๋Ÿฐ๋ฐ ํƒ€์ž… ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ

ํƒ€์ž… ์ฒด์ปค๋ฅผ ํ†ต๊ณผํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ '๋ชจ๋ธ๋ง' ํ•œ๋‹ค.

const x = 2 + '3';  // OK, type is string
const y = '2' + 3;  // OK, type is string

์˜ค๋ฅ˜๊ฐ€ ๋  ์ฝ”๋“œ์ด์ง€๋งŒ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์ฒด์ปค๋Š” ์ •์ƒ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์— ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

const a = null + 7;// Evaluates to 7 in JS// ~~~~ Operator '+' cannot be applied to types ...const b = [] + 12;// Evaluates to '12' in JS// ~~~~~~~ Operator '+' cannot be applied to types ...
alert('Hello', 'TypeScript');// alerts "Hello"// ~~~~~~~~~~~~ Expected 0-1 arguments, but got 2
ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฑ„ํƒ ์—ฌ๋ถ€๋Š” ์šฐ๋ฆฌ๋“ค์˜ ์„ ํƒ

๋‹จ์ˆœํžˆ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒƒ ๋ฟ ์•„๋‹ˆ๋ผ ์˜๋„์น˜ ์•Š์€ ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ์˜ค๋ฅ˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ

  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋„์›€์„ ๋ฐ›์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ์ ์€ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • null๊ณผ 7์„ ๋”ํ•œ๋‹ค๊ฑฐ๋‚˜, []๊ณผ 12๋ฅผ ๋”ํ•˜๋Š” ๋“ฑ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ธฐ๋ฉด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์Œ

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

const names = ['Alice', 'Bob'];
console.log(names[2].toUpperCase());
TypeError: Cannot read property 'toUpperCase' of undefined

๋ฐฐ์—ด์ด ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋ผ ๊ฐ€์ •ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” X, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

=> ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…๊ณผ ์‹ค์ œ ๊ฐ’์— ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ


Uploaded by N2T

728x90
๋ฐ˜์‘ํ˜•