Typescript: ์ œ์•ˆ : '๊ฐ์ฒด'๊ธฐ๋ณธ ์œ ํ˜•

์— ๋งŒ๋“  2015๋…„ 01์›” 26์ผ  ยท  17์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/TypeScript

object ๊ธฐ๋ณธ ์œ ํ˜•

์ด ์ œ์•ˆ์€ typescript object ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์œ ํ˜•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์‚ฌ๋ก€

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ํ•ต์‹ฌ API์—๋Š” object ๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Object.getPrototypeOf
  • Object.getOwnPropertyDescriptor
  • Object.create
  • ...๊ธฐํƒ€

ํ˜„์žฌ typescript์—๋Š” ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜• ( string , number ๋“ฑ)์„ ํ•ด๋‹น ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Object.create('string') ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ typescript ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด object ๊ธฐ๋ณธ ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์™€ ์œ ์‚ฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํ˜• ๊ฒ€์‚ฌ

ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ

object ์œ ํ˜•์€ {} ์—์„œ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜•์˜ ํ• ๋‹น ๊ฐ€๋Šฅ์„ฑ์„ ๋บ€ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜•์€ object ํ• ๋‹น ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ด ์•„๋‹Œ ์œ ํ˜•์€ object ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์ฒด๋Š” {} ๋ฐ any ์—๋งŒ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋™์ž‘์€ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์ผ์น˜ํ•˜๋ฉฐ, ์œ ํ˜•์€ typeof value === 'object' ๋ฐ undefined ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํƒ€์ž… ๊ฐ€๋“œ

object : typeof value === 'object' ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์œ ํ˜• ๊ฐ€๋“œ๊ฐ€ ๋„์ž…๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์„ ํƒ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Object ํ•จ์ˆ˜ ์บ์ŠคํŠธ : Object(value) === value ์™€์˜ ๋น„๊ต๋„ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Suggestion help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ์ œ์•ˆ์— +1. ๋‚˜๋Š” WeakMap ๋ฅผ "์ „๋ฌธ๊ฐ€"API๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ๊ฐ์ฒด ์œ ํ˜•๊ณผ ๊ธฐ๋ณธ ์œ ํ˜•์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— TypeScript์—์„œ ๊ตฌ๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ๋˜ํ•œ ๊ฐ ์†์„ฑ์ด ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜•์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” "์˜ค๋ธŒ์ ํŠธ ๋ฐฑ"์„ ์ž…๋ ฅํ•˜๋Š” ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  17 ๋Œ“๊ธ€

Object. ํ•จ์ˆ˜ ์ด์™ธ์˜ ์ผ๋ถ€ API๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Object ์ œ์™ธํ•œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์ฝ”์–ด API์—์„œ๋Š” ์•„๋งˆ๋„ ์ผ๋ถ€ es6 ๊ตฌ์กฐ (WeakMap, Proxy ๋“ฑ)๋งŒ์ด ์ด๋กœ ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“  ๋ฐ‘์ค„ ๋ชจ์Œ ํ•จ์ˆ˜๋Š” ๋” ๋‚˜์€ ํƒ€์ดํ•‘์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ React์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” object ๋˜๋Š” null , ImmutableJS, Mori ๋“ฑ ๋งŒ ํ—ˆ์šฉํ•˜๋Š” 'setState'๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ‘์ค„ ์ˆ˜์ง‘ ์ž‘์—…

์ œ์•ˆ ๊ฒ€ํ†  ํšŒ์˜์—์„œ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์ง€๋งŒ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ์˜ค๋ฅ˜ ์ˆ˜ / ํ’๋ถ€ํ•œ ์„ค๋ช…์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์œ ํ˜•์˜ ๋ณต์žก์„ฑ์„ ์ •๋‹นํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ, ํŠนํžˆ "์ „๋ฌธ๊ฐ€"API๊ฐ€ ์•„๋‹Œ API (์˜ˆ : ํ”„๋ก์‹œ)์—์„œ ์ž‘๋™ ํ•  ์ˆ˜์—†๋Š” API์˜ ๋” ๋งŽ์€ ์˜ˆ

์ถ”์ฒœ๋ณด๋‹ค ์ฐธ๊ณ ๋กœ ๋” ๋งŽ์ด ์˜ฌ๋ฆฌ๊ธฐ : ์œ™ํฌ :

interface String { _primitiveBrand?: string; }
interface Boolean { _primitiveBrand?: boolean; }
interface Number { _primitiveBrand?: number; }

interface ObjectOnly {  _primitiveBrand?: void; }

function fn(x: ObjectOnly) { }

// Error
fn(43);
// Error
fn('foo');
// OK
fn({});
// OK
fn(window);

์ด ์ œ์•ˆ์— +1. ๋‚˜๋Š” WeakMap ๋ฅผ "์ „๋ฌธ๊ฐ€"API๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์€ ๊ฐ์ฒด ์œ ํ˜•๊ณผ ๊ธฐ๋ณธ ์œ ํ˜•์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— TypeScript์—์„œ ๊ตฌ๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ๋˜ํ•œ ๊ฐ ์†์„ฑ์ด ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์œ ํ˜•์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” "์˜ค๋ธŒ์ ํŠธ ๋ฐฑ"์„ ์ž…๋ ฅํ•˜๋Š” ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Object.observe ์—๋Š” ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๋Œ€์ƒ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. http://arv.github.io/ecmascript-object-observe/#Object.observe

์ œ๋ชฉ์ด "primitive"๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ _ "ECMAScript ๊ฐœ์ฒด ์œ ํ˜•"_ ๋˜๋Š” _ "๋Ÿฐํƒ€์ž„ ๊ฐœ์ฒด ์œ ํ˜•"_์ด๋ผ๊ณ ๋„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ์œ ํ˜• ( undefined ์œ ํ˜• ๋ฐ ๊ธฐํ˜ธ ํฌํ•จ), ํ•จ์ˆ˜ ๋˜๋Š” ์ƒ์„ฑ์ž ์œ ํ˜• ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์—์„œ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ฉ๋ฒ•์  ์ธ object ์œ ํ˜•์— ๋Œ€ํ•œ ๊ธฐ์ค€์€ ๋‹ค์Œ ๊ฐ€๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

let isObject (x) => typeof x === "object";

MDN ์— ๋”ฐ๋ฅด๋ฉด ์ด๊ฒƒ์€ typeof ์˜ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

์ •์˜๋˜์ง€ ์•Š์Œ : "์ •์˜๋˜์ง€ ์•Š์Œ"
Null : "๊ฐ์ฒด"(์•„๋ž˜ ์ฐธ์กฐ)
๋ถ€์šธ : "๋ถ€์šธ"
๋ฒˆํ˜ธ : "์ˆซ์ž"
๋ฌธ์ž์—ด : "๋ฌธ์ž์—ด"
๊ธฐํ˜ธ (ECMAScript 2015์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ) : "symbol"
ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด (JS ํ™˜๊ฒฝ์—์„œ ์ œ๊ณต) : ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฆ„
Function ๊ฐ์ฒด (ECMA-262 ์šฉ์–ด๋กœ [[Call]] ๊ตฌํ˜„) : "function"
๋‹ค๋ฅธ ๊ฐœ์ฒด : "๊ฐœ์ฒด"

์ด ์œ ํ˜•์ด ์—†์œผ๋ฉด ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๊ฐ€๋“œ์— ๋Œ€ํ•ด ์ •ํ™•ํ•œ ์œ ํ˜•์„ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜์‹œํ‚ฌ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋“œ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ ์†์„ฑ์ด ์žˆ๊ณ  for in ๋ฃจํ”„ ๋ฐ Object ํ”„๋กœํ†  ํƒ€์ž…์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์š”๊ตฌํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์™€ T extends object ์™€ ๊ฐ™์€ ์ผ๋ฐ˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค Object ๊ทธ๋Ÿฐ ๋‹ค์Œ ์•ˆ์ „ํ•˜๊ฒŒ ์†์„ฑ์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํ†  ํƒ€์ž… ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์™€ ์ƒ์„ฑ์ž๋ฅผ ์ œ์™ธํ•˜๋ฉด ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์•ฝ๊ฐ„์˜ ์ œํ•œ์ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ์ด๋ฅผ ํฌํ•จํ•˜๊ณ  _ "๊ธฐ๋ณธ์ด ์•„๋‹Œ ๊ฐ์ฒด ์œ ํ˜•"_์ด๋ผ๊ณ ํ•˜๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ณต์šฉ์ฒด object | Function ์žˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์บ์ŠคํŠธ ๋˜๋Š” ์ถ”๊ฐ€ ๊ฐ€๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PR ์ˆ˜๋ฝ. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ interface object { ... } ์“ธ๋งŒํผ ์šฉ๊ฐํ•œ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ๊ฐ„๋‹จํ•ด์•ผํ•˜๋ฉฐ ์œ„์— ์„ค๋ช… ๋œ ๊ทœ์น™์„ ๋”ฐ๋ผ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ์šฐ๋ฆฌ ๋ชจ๋‘ @fdecampredon ์ด ์–ด๋””

@RyanCavanaugh ์ผ์˜ ๋„์‹œ ๋ณ€๊ฒฝ, ๊ทธ๋ฆฌ๊ณ  ๋ถˆํ–‰ํžˆ๋„ ๋‚ด ์ƒˆ ์ง์žฅ์—์„œ ๋งŽ์€ ํƒ€์ดํ”„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค : D

ํฐ. TS1.8์—์„œ์ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ object ์œ ํ˜•๊ณผ ๊ฐ™์€ ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•˜๋ฏ€๋กœ typeof value === 'object' ๋ถ€ํ•ฉํ•ด์•ผํ•˜๋Š”์ง€ ์˜๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ์˜ˆ์ƒ๋˜๋Š” object ์œ ํ˜•์€ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด ์–ธ์–ด ์œ ํ˜•์„ ๋ฐ˜์˜ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ํ•ญ์ƒ ์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” API๋„ ํ•จ์ˆ˜๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ ๋Š” Object ์ƒ์„ฑ์ž์—์„œ ์ƒ์†๋ฉ๋‹ˆ๋‹ค.

์ˆœ์„œ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐˆ ๊ฒŒ์š”.

์•„ํ”ผ์Šค

๊ฐœ์ฒด ๋งŒ๋ฐ›๋Š” WeakMap ์™€ ๊ฐ™์€ API๋Š” ์ผ๋ฐ˜ ๊ฐœ์ฒด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ์ฒด ์–ธ์–ด ์œ ํ˜•์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

function theAnswer() {}

let map = new WeakMap();

map.set(theAnswer, 42);
console.log(map.get(theAnswer)); // 42

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

๊ณ„์Šน

๋•Œ๋ฌธ์— Function ํ™•์žฅ Object ์ƒ์„ฑ์ž๋ฅผ, ์šฐ๋ฆฌ๋Š”์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ •์  ๋ฐ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค Object ๊ธฐ๋Šฅ์—๋ฟ๋งŒ ์•„๋‹ˆ๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

class DeepThought {
  static getAnswer() {
    return 42;
  }
}

let computer = Object.create(DeepThought);

console.log(computer.getAnswer()); // 42
console.log(Object.getPrototypeOf(computer)); // [Function: DeepThought]

์œ„์˜ ์˜ˆ๋Š” ์•ฝ๊ฐ„ ์–ด๋ฆฌ์„์€ ์ผ์ด์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ Object ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” API๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์ˆ˜๋ฝ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ object ์œ ํ˜•์€ Object ์–ธ์–ด ์œ ํ˜•์— ํ•ด๋‹นํ•˜๋Š” ๋‹ค์Œ์„ ๋”ฐ๋ฅด๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค ( null ํ•˜์ง€๋งŒ TypeScript์—์„œ null ์— ๋Œ€ํ•œ ๋ณดํ˜ธ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ ).

function isObject(value) {
  return typeof value === 'object' || typeof value === 'function';
}

์‚ฌ์šฉ ์‚ฌ๋ก€

์ค‘์ฒฉ ๋œ ๊ฐœ์ฒด์˜ ํ‚ค-๊ฐ’ ์Œ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๊ทธ ๊ณผ์ •์—์„œ ๊ธฐ๋ณธ ๊ฐ’์„ ๋ณ€ํ™˜ํ•˜๋Š” Deep Map ์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ์œ ํ˜•๊ณผ ๊ธฐ๋ณธ ์œ ํ˜•์ด ์•„๋‹Œ ์œ ํ˜•์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž ์ง€์ • NonPrimitive ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

interface NonPrimitive {
  [key: string]: any;
  [index: number]: any;
}

export class DeepMap {
  // ...
  private mapObject(obj: NonPrimitive): NonPrimitive { /* ... */ }
}

NonPrimitive ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์€ ์ด๋ฒˆ์ด ์ฒ˜์Œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

export class DeepMap {
  // ...
  private mapObject(obj: object): object { /* ... */ }
}

์œ„์—์„œ ์ œ์•ˆํ–ˆ๋“ฏ์ด obj ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ Object _language type_์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ‚ค-๊ฐ’ ์Œ์ด ๋ฐ˜๋ณต ํ•  ์ˆ˜์žˆ๋Š” ์†์„ฑ ๋ฒˆ๋“ค์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ•จ์ˆ˜๊ฐ€ object ๋ผ๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜๋„๋Š” ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ์™ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์•„, ๊ทธ๊ฒŒ ์˜๋„ ์˜€์Œ์— ํ‹€๋ฆผ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋‚˜๋Š” typeof value === 'object' ์ด ๋ชจ๋“  ์ด์•ผ๊ธฐ์—์„œ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์ด object ์œ ํ˜•์ด ์ž„์‹œ ์†์„ฑ ํ• ๋‹น (์˜ˆ any )์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค๋ฉด :

const foo: object = {};

foo.bar = 'baz';

์•„๋‹ˆ

์‹ค์งˆ์ ์ธ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ

export class DeepMap {
  // ...
  private mapObject(obj: object): object { /* ... */ }
}

๊ณผ

export class DeepMap {
  // ...
  private mapObject(obj: Object): Object { /* ... */ }
}

? ( object ๋Œ€ Object ). Function ๋Š” Object ์—์„œ ํ™•์žฅ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์™œ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ•  ์ˆ˜ ์—†๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@trusktr null ๋ฐ undefined ์ด์™ธ์˜ ๋ชจ๋“  ๊ฐ’์€ Object ์œ ํ˜•์— ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Object ๋ฅผ๋ฐ›๋Š” ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถ€์šธ ๋˜๋Š” ๊ธฐํ˜ธ๋ฅผ๋ฐ›์Šต๋‹ˆ๋‹ค. ์›์‹œ ๊ฐ’์ด ์•„๋‹Œ ๊ฐ’๋งŒ object ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋“ฑ์„ ์ „๋‹ฌํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. object ์œ ํ˜•์€ ์›์‹œ ๊ฐ’์ด ์•„๋‹Œ ๊ฐ’์„ ์˜ˆ์ƒํ•˜์ง€๋งŒ ํ•ด๋‹น ์†์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰