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
์์ ๋น๊ต๋ ํ์ฉ ํ ์ ์์ต๋๋ค.
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
์ ํ์ ํจ์๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด ์ธ์ด ์ ํ์ ๋ฐ์ํด์ผํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ๋ํ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
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
์ ํ์ ์์ ๊ฐ์ด ์๋ ๊ฐ์ ์์ํ์ง๋ง ํด๋น ์์ฑ์ด ๋ฌด์์ธ์ง ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ์ ์์ +1. ๋๋
WeakMap
๋ฅผ "์ ๋ฌธ๊ฐ"API๋ผ๊ณ ์๊ฐํ์ง๋ ์์ง๋ง, ์ด๊ฒ์ ๊ตฌํํ๊ธฐ์ ์ถฉ๋ถํ ์ด์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐํ์์ ๊ฐ์ฒด ์ ํ๊ณผ ๊ธฐ๋ณธ ์ ํ์ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ TypeScript์์ ๊ตฌ๋ถ์ ์ํํ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.์ด ์ ์์ ๋ํ ๊ฐ ์์ฑ์ด ์ ํ ์ฌํญ์ด์ง๋ง ๋ค๋ฅธ ๊ธฐ๋ณธ ์ ํ์ ํ์ฉ๋์ง ์๋ "์ค๋ธ์ ํธ ๋ฐฑ"์ ์ ๋ ฅํ๋ ๋ฌธ์ ๋ ํด๊ฒฐํฉ๋๋ค.