# ๐Ÿ“„ Item34 ~ 38


# Item34. ๋ถ€์ •ํ™•ํ•œ ํƒ€์ž…๋ณด๋‹ค๋Š” ๋ฏธ์™„์„ฑ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ธฐ

  • ํƒ€์ž… ์•ˆ์ „์„ฑ์—์„œ ๋ถˆ์พŒํ•œ ๊ณจ์งœ๊ธฐ๋Š” ํ”ผํ•ด์•ผ ํ•œ๋‹ค. ํƒ€์ž…์ด ์—†๋Š” ๊ฒƒ๋ณด๋‹ค ์ž˜๋ชป๋œ ๊ฒŒ ๋” ๋‚˜์˜๋‹ค.
    • ๋ถˆ์พŒํ•œ ๊ณจ์งœ๊ธฐ(uncanny valley) : ํƒ€์ž… ์„ ์–ธ์—์„œ ์–ด์„คํ”„๊ฒŒ ์™„๋ฒฝ์„ ์ถ”๊ตฌํ•˜๋ ค๋‹ค๊ฐ€ ์˜คํžˆ๋ ค ์—ญํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ
  • ์ •ํ™•ํ•˜๊ฒŒ ํƒ€์ž…์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ๋˜ํ•œ any์™€ unknown๋ฅผ ๊ตฌ๋ณ„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ํƒ€์ž… ์ •๋ณด๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋งŒ๋“ค์ˆ˜๋ก ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค. ์ •ํ™•๋„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ ๊ฒฝํ—˜๊ณผ๋„ ๊ด€๋ จ๋œ๋‹ค.

# โž• unknown vs any vs never

# โœ”๏ธ unknown

  • Typescript์˜ ํƒ‘ ํƒ€์ž…์ด๋ฉฐ, Typescript์— ์กด์žฌํ•˜๊ณ , ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํƒ€์ž…๋“ค์„ ํฌํ•จํ•˜์—ฌ ์–ด๋–ค ๊ฐ’์ด๋“  ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋กœ ์ธํ•ด ๋ชจ๋“  ํƒ€์ž…์ด ๊ณตํ†ต์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ ์™ธ์—๋Š” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์—†๋‹ค.
    • ๊ทธ๋ž˜์„œ ์ด ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๋‹ค์‹œ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • ๋˜ํ•œ ์ด ํƒ€์ž… ๋ณ€์ˆ˜๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๋œ ํ›„์—๋Š” ํƒ€์ž…์„ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด if ์กฐ๊ฑด๋ฌธ์—์„œ ์—„๊ฒฉํ•œ ๋น„๊ต๋ฅผ ํ†ตํ•ด ํ†ต๊ณผํ•œ ๊ฒฝ์šฐ ๊ทธ ์•ˆ์˜ ์‹คํ–‰๋ฌธ์—์„œ๋Š” ๋ณ„๋„์˜ ํƒ€์ž… ๋ช…์‹œ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
let value: unknown = 'wow';
value = 123; // unknown ํƒ€์ž…์€ ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ’์ด๋“  ํ• ๋‹น, ์žฌํ• ๋‹น ๋ชจ๋‘ ๊ฐ€๋Šฅ

const value2: number = value; // error! (value ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ number ํƒ€์ž… ๋ณ€์ˆ˜์— ํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ)
const value3: number = (value as number); // ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํƒ€์ž… ๋ช…์‹œ๋ฅผ ํ•ด์ค˜์•ผ ํ•จ

# โœ”๏ธ any

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

# โœ”๏ธ never

  • unknown ํƒ€์ž…๊ณผ ๋ฐ˜๋Œ€๋กœ never ํƒ€์ž…์€ ๋ชจ๋“  ํƒ€์ž…์˜ ํ•˜์œ„ ํƒ€์ž…์ด๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ๋‹ค๋ฅธ ๊ฐ’๋„ never ํƒ€์ž…์— ํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค.
// ๋ชจ๋‘ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ
const first: never = 123;
const second: never = 'wow';
  • never ํƒ€์ž… ์‚ฌ์šฉ ์˜ˆ์‹œ
// 1) ์–ด๋–ค ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜์—์„œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…
const showError = (message: string): never => {
  throw new Error(message);
}

// 2) ํŠน์ • ํƒ€์ž… ๊ฐ’์„ ํ• ๋‹น๋ฐ›์ง€ ์•Š๋„๋ก ํ•˜๋Š” ํƒ€์ž… ์˜ˆ์‹œ
// ์•„๋ž˜ ์˜ˆ์‹œ๋Š” string ํƒ€์ž…์ธ ๊ฒฝ์šฐ๋Š” never๋กœ ์ถ”๋ก ํ•˜์—ฌ string ํƒ€์ž…์˜ ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ๋ชปํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
type NonString<T> = T extends string ? never : T;

๐Ÿ“„ Reference

  • https://xo.dev/typescript-unknown-any-never/


# Item35. ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ, API์™€ ๋ช…์„ธ๋ฅผ ๋ณด๊ณ  ํƒ€์ž… ๋งŒ๋“ค๊ธฐ

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

# Item36. ํ•ด๋‹น ๋ถ„์•ผ์˜ ์šฉ์–ด๋กœ ํƒ€์ž… ์ด๋ฆ„ ์ง“๊ธฐ

  • ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ๋ถ„์•ผ์˜ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋Š” ๊ฐ™์€ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ธ€์„ ์“ธ ๋•Œ๋‚˜ ๋ง์„ ํ•  ๋•Œ, ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ง€๋ฃจํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์˜์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋™์˜์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธ€์„ ์ฝ์„ ๋•Œ๋Š” ์ข‹์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ”๋“œ์—์„œ๋Š” ์ข‹์ง€ ์•Š๋‹ค.
    • ์ •๋ง๋กœ ์˜๋ฏธ์ ์œผ๋กœ ๊ตฌ๋ถ„์ด ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค๋ฅธ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • data, info, thing, item, object, entity ๊ฐ™์€ ๋ชจํ˜ธํ•˜๊ณ  ์˜๋ฏธ ์—†๋Š” ์ด๋ฆ„์€ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.
    • ๋งŒ์•ฝ entity๋ผ๋Š” ์šฉ์–ด๊ฐ€ ํ•ด๋‹น ๋ถ„์•ผ์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด ๊ดœ์ฐฎ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ๊ท€์ฐฎ๋‹ค๊ณ  ๋ฌด์‹ฌ์ฝ” ์˜๋ฏธ ์—†๋Š” ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ๋Š” ์•ˆ ๋œ๋‹ค.
  • ์ด๋ฆ„์„ ์ง€์„ ๋•Œ๋Š” ํฌํ•จ๋œ ๋‚ด์šฉ์ด๋‚˜ ๊ฐœ์„  ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด INodeList ๋ณด๋‹ค๋Š” Directory๊ฐ€ ๋” ์˜๋ฏธ์žˆ๋Š” ์ด๋ฆ„์ด๋‹ค.
    • Directory๋Š” ๊ตฌํ˜„์˜ ์ธก๋ฉด์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋…์ ์ธ ์ธก๋ฉด์—์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ๊ฐํ•˜๊ฒŒ ๋œ๋‹ค.
    • ์ข‹์€ ์ด๋ฆ„์€ ์ถ”์ƒํ™”์˜ ์ˆ˜์ค€์„ ๋†’์ด๊ณ  ์˜๋„์น˜ ์•Š์€ ์ถฉ๋Œ์˜ ์œ„ํ—˜์„ฑ์„ ์ค„์—ฌ ์ค€๋‹ค.

# Item37. ๊ณต์‹ ๋ช…์นญ์—๋Š” ์ƒํ‘œ๋ฅผ ๋ถ™์ด๊ธฐ

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

# Item38. any ํƒ€์ž…์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ข์€ ๋ฒ”์œ„์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ

# (1) ํ•จ์ˆ˜์—์„œ any ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ

  • any๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
function f1() {
  const x: any = expressionReturningFoo(); // Don't!
  processBar(x);
}

function f2() {
  const x = expressionReturningFoo()
  processBar(x as any); // Do!
}
  • ์œ„ ๋ฐฉ๋ฒ• ์ค‘ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” any ํƒ€์ž…์ด processBar ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ๋งŒ ์‚ฌ์šฉ๋œ ํ‘œํ˜„์‹์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ์ฝ”๋“œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • any์˜ ์‚ฌ์šฉ ๋ฒ”์œ„๋ฅผ ์ข๊ฒŒ ์ œํ•œํ•ด์•ผ any ํƒ€์ž…์ด ์ „ํ˜€ ์—ฐ๊ด€์—†๋Š” ํ•จ์ˆ˜ ๋ฐ”๊นฅ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
  • ๋น„์Šทํ•œ ๊ด€์ ์—์„œ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋ฉด any ํƒ€์ž…์ด ํ•จ์ˆ˜ ๋ฐ”๊นฅ์œผ๋กœ ์˜ํ–ฅ์ด ๋ฏธ์น˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

# (2) ๊ฐ์ฒด์—์„œ any ํƒ€์ž… ์‚ฌ์šฉํ•˜๊ธฐ

const config: Config = {
  a: 1,
  b: 2,
  c: {
    key: value,
     // ~~~ 'foo' ์†์„ฑ์ด 'Foo' ํƒ€์ž…์— ํ•„์š”ํ•˜์ง€๋งŒ, 'Bar' ํƒ€์ž…์—๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  }
}
  • ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋Š” config ๊ฐ’ ์ž์ฒด๋ฅผ as any๋กœ ์„ ์–ธํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ์ฒด ์ „์ฒด๋ฅผ any๋กœ ๋‹จ์–ธํ•˜๋ฉด ๋‹ค๋ฅธ ์†์„ฑ๋“ค(a์™€ b) ์—ญ์‹œ ํƒ€์ž… ์ฒดํฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๋ถ€์ž‘์šฉ์ด ์ƒ๊ธด๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ตœ์†Œํ•œ์˜ ๋ฒ”์œ„์—๋งŒ any๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
const config: Config = {
  a: 1,
  b: 2,
  c: {
    key: value as any,
  }
}