Typescript: рд╕реБрдЭрд╛рд╡: `рд╡рд╕реНрддреБ` рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдЬрдире░ 2015  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: microsoft/TypeScript

object рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ object рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрд░ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ object рд▓реЗрддреЗ рд╣реИрдВ:

  • Object.getPrototypeOf
  • Object.getOwnPropertyDescriptor
  • Object.create
  • ...рдЖрджрд┐

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ ( string , number , рдЖрджрд┐ ...) рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Object.create('string') рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПред
рдПрдХ рдирдпрд╛ object рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рд╕реЗ рдЙрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕рдорд╛рди рдмрд╛рдзрд╛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдЪреЗрдХрд┐рдВрдЧ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

Assignability

object рдкреНрд░рдХрд╛рд░ {} рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдЕрдиреНрдп рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐:

  • рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ object
  • рдХреЛрдИ рднреА рдЧреИрд░-рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ object рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ
  • рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ {} рдФрд░ any рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ

рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреЗ рд▓рд┐рдП рд╕реБрд╕рдВрдЧрдд рд╣реИ, рдкреНрд░рдХрд╛рд░ рд╣рд░ рдореВрд▓реНрдп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдзрд╛ typeof value === 'object' рдкреНрд▓рд╕ undefined рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИред

рдЧрд╛рд░реНрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВ

object : typeof value === 'object' рд▓рд┐рдП рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЧрд╛рд░реНрдб рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рдХ Object рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: Object(value) === value ред

Suggestion help wanted

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ +1ред рдореИрдВ WeakMap рдПрдХ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ" рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рдорд╛рдирддрд╛ рд╣реВрдВред рдЪреВрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ "рдСрдмреНрдЬреЗрдХреНрдЯ рдмреИрдЧ" рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рд╣рд▓ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 17 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Object. рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ API рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдВрдЧреЗред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрд░ рдПрдкреАрдЖрдИ рдореЗрдВ Object рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╢рд╛рдпрдж рдХреБрдЫ es6 рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЛ рдЗрд╕рд╕реЗ (WeakMap, Proxy рдЖрджрд┐) рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕рдВрдЧреНрд░рд╣ рдлрд╝рдВрдХреНрд╢рди рднреА рдмреЗрд╣рддрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдПрдХ 'рд╕реЗрдЯрд╕реНрдЯреИрдЯ' рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ null , ImmutableJS, рдореЛрд░реА рдЖрджрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕рдВрдЧреНрд░рд╣ рдХрд╛рд░реНрдп

рд╕реБрдЭрд╛рд╡ рд╕рдореАрдХреНрд╖рд╛ рдмреИрдардХ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдПрдХ рдирдП рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ / рд╕рдореГрджреНрдзрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдПрдкреАрдЖрдИ рдХреЗ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реЗ рдЬреЛ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ" рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА)

рд╕рд┐рдлрд╛рд░рд┐рд╢ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯрд┐рдВрдЧ: рдкрд▓рдХ:

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 рдПрдХ "рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ" рдПрдкреАрдЖрдИ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рдорд╛рдирддрд╛ рд╣реВрдВред рдЪреВрдВрдХрд┐ рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ "рдСрдмреНрдЬреЗрдХреНрдЯ рдмреИрдЧ" рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рднреА рд╣рд▓ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдкрддреНрддрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Object.observe рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдЖрджрд┐рдо рд▓рдХреНрд╖реНрдп рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: http://arv.github.io/ecmascript-object-observe/#Object.observe

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖рдХ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ "рдЖрджрд┐рдо" рд╢рдмреНрдж рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред рдЗрд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ _ "ECMAScript рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░" _ рдпрд╛ _ "рд░рдирдЯрд╛рдЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░" _ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рдХрд┐ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ ( undefined рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ рд╕рд╣рд┐рдд), рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдХрд╛рдиреВрдиреА object рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рдирджрдВрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧрд╛рд░реНрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

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

рдПрдордбреАрдПрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ typeof рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд : "рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд"
рдЕрд╢рдХреНрдд : "рд╡рд╕реНрддреБ" (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
рдмреВрд▓рд┐рдпрди : "рдмреВрд▓рд┐рдпрди"
рд╕рдВрдЦреНрдпрд╛ : "рд╕рдВрдЦреНрдпрд╛"
рд╕реНрдЯреНрд░рд┐рдВрдЧ : "рд╕реНрдЯреНрд░рд┐рдВрдЧ"
рдкреНрд░рддреАрдХ (ECMAScript 2015 рдореЗрдВ рдирдпрд╛) : "рдкреНрд░рддреАрдХ"
рдореЗрдЬрдмрд╛рди рд╡рд╕реНрддреБ (рдЬреЗрдПрд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ) : рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░
рдлрдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ (рдФрдЬрд╛рд░ [[рдХреЙрд▓]] ECMA-реиремреи рд╢рдмреНрджреЛрдВ рдореЗрдВ) : "рдлрд╝рдВрдХреНрд╢рди"
рдХреЛрдИ рдЕрдиреНрдп рд╡рд╕реНрддреБ : "рд╡рд╕реНрддреБ"

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рдирд╛, рдЙрдкрд░реНрдпреБрдХреНрдд рдЧрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд╛рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдирд╣реАрдВред рдпрд╣ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдбрд╝рд╛рдИ рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ for in рд▓реВрдк рдФрд░ Object рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ T extends object рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдлрд┐рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдпрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реАрдорд┐рдд рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ _ "рдЧреИрд░-рдЖрджрд┐рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░" _ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕рдорд╛рдзрд╛рди рдпреВрдирд┐рдпрди object | Function рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдкреАрдЖрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛ рд▓рдЧрддреА рд╣реИ; рдпрд╣ рдХрд┐рд╕реА рднреА рдмрд╣рд╛рджреБрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ рдЬреЛ interface object { ... } рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛ред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реАрдзрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рд╛рдЗрдб рдиреЛрдЯ: рд╣рдо рд╕рднреА рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ @fdecampredon рдХрд╣рд╛рдВ рд╣реИ!

@RyanCavanaugh рдХрд╛рд░реНрдп рдХреЗ рд╢рд╣рд░ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди, рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореЗрд░реА рдирдИ рдиреМрдХрд░реА рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ: рдбреА

рдорд╣рд╛рдиред рдореИрдВ TS1.8 рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВ рднреА object рдкреНрд░рдХрд╛рд░ рдХреА рддрд░рд╣ рдХреБрдЫ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рд╕рд╡рд╛рд▓ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ typeof value === 'object' рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рд╣рд░ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд object рдкреНрд░рдХрд╛рд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░рдг рд╣реИрдВ:

  • рдПрдкреАрдЖрдИ рдЬреЛ рд╕рд╛рджреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
  • рдХрд╛рд░реНрдп Object рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред

рдореИрдВ рдЗрдиреНрд╣реЗрдВ рдХреНрд░рдо рдореЗрдВ рд▓реВрдВрдЧрд╛ред

рд╢рд╣рдж рдХреА рдордХреНрдЦреА

API рдЬреИрд╕реЗ WeakMap рдЬреЛ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рд╡реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рд╕рд╛рджреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдареАрдХ рд╣реИ:

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 рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ object рдкреНрд░рдХрд╛рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рднрд╛рд╖рд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ (рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕рдореЗрдВ null , рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ null рдореБрдХрд╛рдмрд▓реЗ рдХреЛрдИ рд░рдЦрд╡рд╛рд▓реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ)ред

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

рдЙрджрд╛рд╣рд░рдг

рдореЗрд░реЗ рдкрд╛рд╕ рдбреАрдк рдореИрдк рдирд╛рдордХ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдкреНрд░рдореБрдЦ-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЖрджрд┐рдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЬреИрд╕реЗ, рдпрд╣ рдЖрджрд┐рдо рдФрд░ рдЧреИрд░-рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдПрдХ рдХрд╕реНрдЯрдо 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 s рд╣реИрдВред рдЕрднрд┐рдкреНрд░рд╛рдп рдЖрджрд┐рдо рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЗрд░рд╛рджрд╛ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╢рд╛рдпрдж рдореИрдВ 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

manekinekko picture manekinekko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

remojansen picture remojansen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wmaurer picture wmaurer  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DanielRosenwasser picture DanielRosenwasser  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dlaberge picture dlaberge  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ