{"id":317790,"date":"2021-02-10T15:00:34","date_gmt":"2021-02-10T15:00:34","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=317790"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=317790","title":{"rendered":"\u0418\u043d\u0432\u0435\u0440\u0441\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043d\u0430 \u0433\u043e\u043b\u043e\u043c TypeScript \u0431\u0435\u0437 \u0431\u043e\u043b\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u041a\u0430\u0440\u043b\u043e\u0432\u0441\u043a\u0438\u0439 \u0438 (\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0431\u044f \u043f\u043e\u043c\u043d\u044e) \u044f \u0431\u043e\u0440\u044e\u0441\u044c \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c. \u0412\u0435\u0434\u044c \u043e\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0441\u0442\u043d\u043e\u0435, \u0434\u0443\u0431\u043e\u0432\u043e\u0435, \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u0445\u043e\u0447\u0443. \u041d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u043e \u0442\u0435\u0440\u043f\u0435\u0442\u044c \u0438 \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u0438\u043a\u0442\u0443\u0435\u0442 \u043c\u043d\u0435, \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u0438 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0434\u0435\u043b\u0430\u0442\u044c, \u0430 \u044f \u0434\u0438\u043a\u0442\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e \u043a\u0430\u043a\u0438\u043c \u0435\u043c\u0443 \u0431\u044b\u0442\u044c.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u0434\u0430\u043b\u0435\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043f\u0440\u043e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0447\u0435\u0440\u0435\u0437 &#171;\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#187;. \u041c\u043d\u043e\u0433\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u043f\u043e &#171;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#187; &#8212; \u043e\u043d\u0438 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442. \u041c\u044b \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u0443 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 TypeScript.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5eb\/032\/f5b\/5eb032f5b736749a4e50dabbafd4ddd2.png\" width=\"776\" height=\"366\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443 \u0432\u044b\u0437\u0432\u0430\u0432\u0448\u0435\u0439 \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443 \u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0441\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0438 \u043d\u0435 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0435\u0440\u0444\u043e\u043c\u0430\u043d\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u0439\u043f\u0447\u0435\u043a \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435, \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">namespace $ {     export let $user_name: string = 'Anonymous' } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043b\u043e\u0433:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $log( this: $, ... params: unknown[] ) {         console.log( ... params )     } } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <code>this<\/code>. \u041e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">$log( 123 ) \/\/ Error <\/code><\/pre>\n<p>\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<pre><code class=\"cs\">$.$log( 123 ) \/\/ OK <\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e <code>$<\/code> \u0443 \u043d\u0430\u0441 &#8212; \u044d\u0442\u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441, \u0430 \u043d\u0435 \u0442\u0438\u043f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"cs\">namespace $ {     export type $ = typeof $ } <\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 <code>this<\/code>, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $hello( this: $ ) {         this.$log( 'Hello ' + this.$user_name )     } } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u041d\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u043b\u043e \u0441\u043c\u044b\u0441\u043b\u0430, \u043f\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439, \u043f\u0430\u0442\u0447\u0438\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0435\u0439 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $ambient(         this: $,         over: Partial&amp;lt; $ &gt;,     ): $ {         const context = Object.create( this )         for( const field of Object.getOwnPropertyNames( over ) ) {             const descr = Object.getOwnPropertyDescriptor( over, field )!             Object.defineProperty( context, field, descr )         }         return context     } } <\/code><\/pre>\n<p><code>Object.create<\/code> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u044b\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0451\u0442\u0441\u044f. \u0410 \u0432\u043e\u0442 <code>Object.assign<\/code> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0433\u0435\u0442\u0442\u0435\u0440\u044b, \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b. \u042d\u0442\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u043d\u0430\u043c \u0435\u0449\u0451 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0430 \u043f\u043e\u043a\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_greets_anon_by_default( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          this.$hello()         this.$assert( logs, [ 'Hello Anonymous' ] )      } } <\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043e\u043d \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f &#8212; \u043f\u0430\u0442\u0447\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>$log<\/code>, \u0447\u0442\u043e\u0431\u044b \u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0430 \u0432\u0441\u0435 \u043b\u043e\u0433\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432 \u043b\u043e\u0433\u0438 \u0432\u044b\u0432\u0435\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0430\u0441\u0435\u0440\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $assert&amp;lt; Value &gt;( a: Value, b: Value ) {          const sa = JSON.stringify( a, null, '\\t' )         const sb = JSON.stringify( b, null, '\\t' )          if( sa === sb ) return         throw new Error( `Not equal\\n${sa}\\n${sb}`)      } } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0442\u0435\u0441\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 <code>$.$test<\/code>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0441\u043a\u043e\u043f\u043e\u043c:<\/p>\n<pre><code class=\"cs\">namespace $ {     export async function $test_run( this: $ ) {          for( const test of Object.values( this.$test ) ) {             await test.call( this.$isolated() )         }          this.$log( 'All tests passed' )     } } <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0430 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c. \u042d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0433\u0434\u0435 \u0437\u0430\u043c\u043e\u043a\u0430\u043d\u044b \u0432\u0441\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c (\u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0444\u0430\u0439\u043b\u044b, \u0440\u0430\u043d\u0434\u043e\u043c \u0438 \u0442.\u0434.). \u0418\u0441\u0445\u043e\u0434\u043d\u043e, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $isolated( this: $ ) {         return this.$ambient({})     } } <\/code><\/pre>\n<p>\u041d\u043e \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>$log<\/code> \u043f\u0438\u0448\u0435\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0435\u0439 \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>$isolated<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 <code>$log<\/code> \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0441\u0430\u0439\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">namespace $ {     const base = $isolated     $.$isolated = function( this: $ ) {         return base.call( this ).$ambient({             $log: ()=&gt; {}         })     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043b\u044e\u0431\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432 \u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>$log<\/code>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438 \u0442\u0435\u0441\u0442, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_greets_overrided_name( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          const context = this.$ambient({ $user_name: 'Jin' })         context.$hello()         this.$hello()          this.$assert( logs, [ 'Hello Jin', 'Hello Anonymous' ] )      } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0432\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $thing {         constructor( private _$: $ ) {}         get $() { return this._$ }     } } <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0438\u043d\u044a\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0418 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u0435\u0442\u0442\u0435\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0451\u043c\u043e\u043c \u043a\u043e\u0434\u0430. \u0413\u0435\u0442\u0442\u0435\u0440 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0432 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043a\u043e\u0432. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a \u0438\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a:<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $hello_card extends $thing {          get $() {             return super.$.$ambient({                 $user_name: super.$.$user_name + '!'             })         }          get user_name() {             return this.$.$user_name         }         set user_name( next: string ) {             this.$.$user_name = next         }          run() {             this.$.$hello()         }      } } <\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_card_greets_anon_with_suffix( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          const card = new $hello_card( this )         card.run()          this.$assert( logs, [ 'Hello Anonymous!' ] )      } } <\/code><\/pre>\n<p>\u0421\u0443\u043f\u0435\u0440, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439:<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $hello_page extends $thing {          get $() {             return super.$.$ambient({                 $user_name: 'Jin'             })         }          @ $mem         get Card() {             return new this.$.$hello_card( this.$ )         }          get user_name() {             return this.Card.user_name         }         set user_name( next: string ) {             this.Card.user_name = next         }          run() {             this.Card.run()         }      } } <\/code><\/pre>\n<p>\u0412\u044b\u043d\u043e\u0441\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043b\u0430\u0434\u0435\u0438\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u0418\u043d\u044a\u0435\u043a\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0418 \u043c\u0435\u043c\u043e\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>$mem<\/code>. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0430\u043c\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $mem(         host: object,         field: string,         descr: PropertyDescriptor,     ) {         const store = new WeakMap&amp;lt; object, any &gt;()          return {             ... descr,             get() {                  let val = store.get( this )                 if( val !== undefined ) return val                  val = descr.get!.call( this )                 store.set( this, val )                  return val             }         }      } } <\/code><\/pre>\n<p><code>WeakMap<\/code> \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043d\u0435 \u043b\u043e\u043c\u0430\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u044e. \u0427\u0442\u043e \u0436, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c, \u0430 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0441\u044f:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_page_greets_overrided_name_with_suffix( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          const page = new $hello_page( this )         page.run()          this.$assert( logs, [ 'Hello Jin!' ] )      } } <\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0435\u0433\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $app_card extends $.$hello_card {          get $() {             const form = this             return super.$.$ambient({                 get $user_name() { return form.user_name },                 set $user_name( next: string ) { form.user_name = next }             })         }          get user_name() {             return super.$.$storage_local.getItem( 'user_name' ) ?? super.$.$user_name         }         set user_name( next: string ) {             super.$.$storage_local.setItem( 'user_name', next )         }      } } <\/code><\/pre>\n<p>\u0421\u0430\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043b\u0438\u0430\u0441 \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"cs\">namespace $ {     export const $storage_local: Storage = window.localStorage } <\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437 \u043e\u043d\u043e \u0443 \u043d\u0430\u0441 \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0438\u0442\u0441\u044f, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u044f\u0434\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0438 \u043c\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0432 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442:<\/p>\n<pre><code class=\"cs\">namespace $ {     const base = $isolated     $.$isolated = function( this: $ ) {          const state = new Map&amp;lt; string, string &gt;()         return base.call( this ).$ambient({              $storage_local: {                 getItem( key: string ){ return state.get( key ) ?? null },                 setItem( key: string, val: string ) { state.set( key, val ) },                 removeItem( key: string ) { state.delete( key ) },                 key( index: number ) { return [ ... state.keys() ][ index ] ?? null },                 get length() { return state.size },                 clear() { state.clear() },             }          })      } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>$hello_card<\/code> \u043d\u0430 \u0441\u0432\u043e\u0439 <code>$app_card<\/code>, \u0438 \u0432\u0441\u0451 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e.<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $app extends $thing {          get $() {             return super.$.$ambient({                 $hello_card: $app_card,             })         }          @ $mem         get Hello() {             return new this.$.$hello_page( this.$ )         }          get user_name() {             return this.Hello.user_name         }          rename() {             this.Hello.user_name = 'John'         }      } } <\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u0433\u0434\u0435 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u0441\u0442\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0438\u043c\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e, \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0438 \u043e\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0434\u0447\u0438\u0449\u0430\u0435\u043c \u0437\u0430 \u0441\u043e\u0431\u043e\u0439, \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430:<\/p>\n<pre><code class=\"cs\">namespace $.$test {     export function $changable_user_name_in_object_tree( this: $ ) {          const name_old = this.$storage_local.getItem( 'user_name' )         this.$storage_local.removeItem( 'user_name' )          const app1 = new $app( this )         this.$assert( app1.user_name, 'Jin!' )          app1.rename()         this.$assert( app1.user_name, 'John' )          const app2 = new $app( this )         this.$assert( app2.user_name, 'John' )          this.$storage_local.removeItem( 'user_name' )         this.$assert( app2.user_name, 'Jin!' )          if( name_old !== null ) {             this.$storage_local.setItem( 'user_name', name_old )         }      } } <\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442\u044b \u043d\u0435\u0441\u043f\u0440\u043e\u0441\u0442\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u0442\u0438\u043b\u0435, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u043d\u043e \u0438 \u043d\u0430 \u0433\u0440\u044f\u0437\u043d\u043e\u043c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0433\u043e\u043d\u044f\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0442\u0435\u0441\u0442\u044b \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0442\u0435\u0441\u0442\u044b \u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0432\u0441\u044e \u043d\u0430\u0448\u0443 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"cs\">namespace $ {     await $.$test_run() } <\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438\u0445 \u0436\u0435, \u043d\u043e \u0431\u0435\u0437 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0433\u0434\u0435 <code>$isolated<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043d\u043e \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"cs\">    $.$ambient({         $isolated: function(){ return $.$ambient({}) }     }).$test_run() } <\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432 \u0421\u0430\u0444\u0430\u0440\u0438 \u0432 \u043f\u043e\u0440\u043d\u043e \u0440\u0435\u0436\u0438\u043c\u0435, \u0432\u044b\u0434\u0430\u0441\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043d\u0451\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a localStorage, \u0430 \u044d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0432 \u043d\u0430\u0448\u0435\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>$storage_local<\/code> \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d.<\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u0442\u0435\u0441\u0442\u044b \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u043e\u0451\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u043d\u0430 TechLeadConf: <a href=\"https:\/\/slides.hyoo.ru\/#slides=https%3A%2F%2Fnin-jin.github.io%2Fslides%2Ftesting%2F\" rel=\"noopener noreferrer nofollow\">\u0424\u0440\u0430\u043a\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a>.<\/p>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0436\u0435 \u0442\u0443\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u043e <a href=\"https:\/\/mol.hyoo.ru\/\" rel=\"noopener noreferrer nofollow\">\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 $mol<\/a>, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u0435\u043c\u0443 \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u043a\u043e\u0434\u0430. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f\u2026<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0441\u043c\u0443\u0449\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u0438 \u043e\u0442c\u0443\u0442\u0441\u0442\u0432\u0438\u0435 import\/export, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c: <a href=\"https:\/\/github.com\/hyoo-ru\/mam_mol\/wiki\/Fully-Qualified-Names-vs-Imports\" rel=\"noopener noreferrer nofollow\">Fully Qualified Names vs Imports<\/a>. \u0410 \u0435\u0441\u043b\u0438 \u0441\u043c\u0443\u0449\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u0441 \u044d\u0442\u0438\u043c: <a href=\"https:\/\/github.com\/hyoo-ru\/mam_mol\/wiki\/PascalCase-vs-camelCase-vs-kebab-case-vs-snake_case\" rel=\"noopener noreferrer nofollow\">PascalCase vs camelCase vs kebab case vs snake_case<\/a>.<\/p>\n<p><a href=\"https:\/\/www.typescriptlang.org\/play?emitDecoratorMetadata=false#code\/PQKhAIHEBsHsCMCG1yILbwJYFMB2AXcAY1gOwA9CRgAoXdbAZwAdEjtwAScAbxvAHhQEGAmTFSjfIgLhq-QRWawAToWjZCnAK6NsKgPr002AFzgpKzLgDm4ALzgA5AEFcpAJ5pYupzQC+NHQMLGwc3HyCQmDgLhg4siRklOD4Hswc8lFKqoRpGVwOqenYsABmXAFBxkys7IWRgsLgAAoqsAAm2uyM4B36mABu2B3gmIyw0Ij4I6jxeIRJMylZiuTKauBl2rhE+JikXOOT0yMAFKkAFuPm3ACUvApRAiqa2iq4V+MAdJzoWAszjx-HcnuBAoFgiZQvUImDmqIkChtrt9odVgIcpsUXsDp9OHAbBd8NdGLcADTgb7U8CsFToMngHYAa3cAHdcABtAC64AejWeElwEw030JF2p31piHpaF6oKiEKhtTCDXhMQAkiLTqNhipGHjwOVwDY4EitjtcejaFEklJwEg9EVOMcpjMOmDOL9XTqiji0bhiaTbnzHoKXm8Pg7EHpvkRkNAg+M+b9-gl8ECweGuITzGc7vYAHy8QLZkFgpXKmHhMNNGKI8T+w0k6ZMvS9QbIbRMLbtNBzAGJUjLKg2tYbQhNw6cS7YaBwJOM+61wUkn4E2BE5wACTncGc4AA1F9GL9dPojAw+RWqlW6jWBdEIAAlHa9awD9NCkeoed9bBEFMryjDMUi9Bi4BYoQMYeLsFqooanCgfgBgqDsi4hvyWaCNhAhlKoFx2nkTCEMaADy8AAFYAfg3ydtA3aMIuvzIaGWHZlEiBsogmDEVIcYJsxLrau6+bXmWQTZmup4blurh-shvSsIwegdE44mCJWNTVmqUTNAAypgaDMBoqAqfoAbwVanwQVBVmWX85lqAAPOAABqXYcIWFyIOYHkMdglLwH5nmho+US4UK9qMIgRQAFL6WRABy3yWNYNiYGUHg+ZSuDaPOlJOAAOvg6kKuGREWPA8WJSlaW2Jl2UOrl+XQIVJVlZFkWZRcMUOPYjiMNVDyvPg7y4JFJLtGy4C4NgM0AKIqO0KgXAABklsCENgACO2jIEVuCcDwMX+Idx1Df4a2gjekLafeXAsSRK5PuAAAqJG9Aa-SoGUZQ0XIY6YusuT2Yhs7zrABg2K8miMAYMikAY8AeAY-RlIg+UZiemGPJFlWEr0jg8mZTK4KysAcjyk2kr8hJFIT3zMLolzfFguAdBchMaYKNPrhDC7lautOOXoahc5ujCUpyO57rAsTuLgXg+Iw6m8jdiq3vdqpwnpMRtJ03Q9v0VjDKMaYLN+FCEGyvGXEaepWP04FA5BIPYpaDkWwQZx80u5KRbAermC0Mr7MgrncIWAdRHcIbhYIlVLNbRQUdRexxq8pyLjzzz4atUWTjg0CjORVE0d8NiaGRHIGxkageElIQXEH+hsS92aVc7RAqKn5cZ1X+A17gdcWR4AAiTA95gzD4ARDv6JSZTF6MdwAISRVEacV+j1jYKPDeEcO1tLyvlLd73QvPKW4ajeNVuULd1QhA9XpIc9j7NB9YGfpbycpK3ZamBnaAzBHZKc+IBZQxhtgOGBhAFOxGJeEwGFChYXxpIdQksigkxjGTCmVNuR+zppuBmksmYszZtYTm4BuZXwip3TBD9CCOGkqmeYPseBcHPIYGo5gnBxWsOpcsjDki0RnHLfMxCJGQykdmaRMYxbY0JtLWWkNwCCNwE4Qqu51FuE8N4Xw4B1aSU0lrF+OsXrNAAEIxg4IBRR4BbYkl-kOMRFhtDMAnKA7I7tFhTBUlwNctgO6J0wWhPY89mCm1OOAAwnBcbAkioPLgYkuF3yjGw+J4In53ksZ-GIABhAJvRnH2wQcA2Y3tFjHxWK7OyDjAkyLgAYeMKhRjWzwB0XoSFrghL4MkzQqT2IcQjGNKMjBPH6F+OwwcGYE6jJ0GLZBZgPH1xmUsi8NQjzODXn4UZAgRHhkhNmFJPCVlpM3oIDJnw2Fv3OTUSKN9BR6EIA8hgFw5qUHMPVOwIzRl3LPMs7Zjgvn4CeV1bMaFAz-I4oC5psA5HHNMYc8x0JX5PXtAUiA398C9GqcwheQCQH5yNP3PFPjxygwgVwKBrSZQdGhrDPFCNFYGDKQYSZf1MDkFQcuAZoj7Tc2JryPBLJ2RciIVJEW9NHCM2ZowVm7MaF0MhRVJhbTRigvmrSuW9L2k53oYnBl3xoVSIUU5ZRktVFOF0fufRStDGMD2cY68uTtawisTEAAstgbwmAABePYbmzHot2SlwNvE0s4CYNAvtsyXFgFIcwCB074BjuGZec4Og-PwFYWwGbBQXxDu0euaRJ6MGnrPVQhawoYOFIQKQqgODapmgAdWwIgZk3rEDMFcqmmilIZAeHAN5DWt9IyfAWc8SU-5K0qFraczQlyrmCg0IQeiRQm2vErsuk8ucDljDKBcTda8Bpk13nNVe4AbngHoqu54D6oibscBfXd+A14CXnIap9ght3YFSnu6SlJN1GtGb+sZ9972HuedfFFOS7oWM9di8AxTHFlNcTU9x0TYCsBsNMZs8sSQcGsHNXuA69guzAX44gJTdWQwMHhjgnSOY9OCXYAV4YUmcEuYe29kz1lv2qZmQ9URNm8IYPwzR+yDlHMFLBhh4YAACXBY2DMIIUhlvGDm3rmjNeFdLNVCQPWY+RS63nAo+bCqFk6TzfE0+0747yTAQuzK8tsWyPmzWtrm-NfzQnCx+A5joTnLMmCKGC1z4ZIpmus+GNhwXTXoTAzk91SHwiYsICh3F+KOFYZ-NYWcVgZi7A4FNHwNh7YkGMqQBYvQ82wIjW7KNntwZ6qY0y2BLKKn9EZTUdldtOXaG5bynGaC8aCqwTYIm4BcG9HFZTSV0jZW0PIQqpV1CJbTZMwIet9omMRZ1QixjiAq4-uzExpLML4NRDuYoiyW2pazbUfuTRLqTFpfRfk+DzQWi5HECwACmVMBEFo44vUBpDjGlNGIFAjSqO+O8fDrgvbmD6o6ZQLpPTfiGYZQF8A6nhn49tEw-O-ZWGkgffxqZKgNnCeneZ7hYXsBpJvbZsnoXPPhf8Iug57nxMXO898iweb0phS2KoNAnOJPhe1SkBTxyUsnK40M5zLO4uCmp4J3427TvYAMHAeM0B30ahmHG5wauyrgAAPzW7WdM+5zOosvNV8zz5PmRd+brYegTDuddz3pFXA3sAjeAfwKbv1FwnCW9yinJX8HlcCGaGRR2lSvqwHC8j0lpG26TPgA1zI9SaPI7+F4t2JXulBL6Rxm7ghuPadGVrv3fw8sidEwIY7mrbio-R7z+T8fIoqZjX6wndrEUa+eLpnVBn2t6+MwPxnauG8cVvWwsf0uVkQpi3gKzxPBBr7lhvkFzg4qwEuForfmsIqIa+8h9UEAXDQEwHY3o9B9jDDJWm1I8sCX-1HNRpHJhTgXXIPQ3ZAcwfSAPPXIoW2DmSmMUEPZASA1QPXKoD1B8MESqR0FtI4ESEYe-cAb1EPZkMYYyDQEwAgAjQ4FsQgH0UCCwSpSCP6GiBHQQN+Og2YRwCBPlOtPbRtaQGYQ7GaHtPtT3dKSkX5UdJFTXWzbAr9RMfdO4WZdMTMB9YAqA0AxA6AcwBnFXcPM3C4ZkbADwXzMXO4dJWzKQU4d9Qw4w0MW3WaVqcEPvDiV5CPc3IwkwsQgtO9cA7w-zLhKwmYMPWwjwEDcQB4HnCDNnbwYYdw0I0wkJfkEXaw-oddFncATw0MKI9vAQTwi4ahCgcwPKDANuZI29GWWdIIgDTwpiB4bkGWQo8gV1BwvKP8HI3IlJDQWwEkVnfjAQgDA0INZw6IwCTtVaZI6ouMDQGUMSDo0ZRPa+FLT7FUWETLL1HFT6WkfQA0Kw0rJrcBVracIgS4GQfDeADQAwNXAwaweBclAwAvHg9BSbWaBgeBEuIoO5EA-XMA43QeeIi3ZnTqaVdcb44PUPV4WI7AAE6PIEt1F41HAARiEJRy8XO3ixFnu3FlQC8URKPwYEKje06kiiRNNR3xQRSzu0tR8lxPxJMEJLPy0XhPVQbRxOYAACYUTS9mB0TAsZIsTsZUd2S6TAoT9GTiSQSZIwTfiySoSYTLcds7NRYHs2ThS1dCTrAXVx1BQepXiTB3jRgz1QUnCJ9bsRZpStCw95SgTco3jJhV5L8zEb9ViMDn1YBgFwAzgYI4J8wiwJtwxmhXxPgExUgtiPwODzY8tCUIJOJuJeJHp34pBUJkta8k8YggzfwUBFInE7YfBaCRJDQYy6wIAAAxHiaAd8T4fSRADGKwMYT4aJIYWJbwH6eAACTGJ0NgHoereWX45AwPEjXofOLADofoGyV2WMniLQZQwEXQjvCM8wbg8wtncZfEGczhEEHJMsJQxMlCWLBPO4KRSEIAA\" rel=\"noopener noreferrer nofollow\">TypeScript \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0430 \u0441\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u0434\u043e\u043c \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438.<\/a><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/541800\/\"> https:\/\/habr.com\/ru\/post\/541800\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u041a\u0430\u0440\u043b\u043e\u0432\u0441\u043a\u0438\u0439 \u0438 (\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0431\u044f \u043f\u043e\u043c\u043d\u044e) \u044f \u0431\u043e\u0440\u044e\u0441\u044c \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c. \u0412\u0435\u0434\u044c \u043e\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u0441\u0442\u043d\u043e\u0435, \u0434\u0443\u0431\u043e\u0432\u043e\u0435, \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u044f \u043e\u0442 \u043d\u0435\u0433\u043e \u0445\u043e\u0447\u0443. \u041d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0445\u0432\u0430\u0442\u0438\u0442 \u044d\u0442\u043e \u0442\u0435\u0440\u043f\u0435\u0442\u044c \u0438 \u043d\u0430\u0434\u043e \u0447\u0442\u043e-\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u0438\u043a\u0442\u0443\u0435\u0442 \u043c\u043d\u0435, \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u0438 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0434\u0435\u043b\u0430\u0442\u044c, \u0430 \u044f \u0434\u0438\u043a\u0442\u0443\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e \u043a\u0430\u043a\u0438\u043c \u0435\u043c\u0443 \u0431\u044b\u0442\u044c.<\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u0434\u0430\u043b\u0435\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043f\u0440\u043e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0447\u0435\u0440\u0435\u0437 &#171;\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#187;. \u041c\u043d\u043e\u0433\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u043f\u043e &#171;\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f&#187; &#8212; \u043e\u043d\u0438 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442. \u041c\u044b \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u044d\u0442\u0443 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 TypeScript.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443 \u0432\u044b\u0437\u0432\u0430\u0432\u0448\u0435\u0439 \u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443 \u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u0441\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0438 \u043d\u0435 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435<\/p>\n<\/li>\n<li>\n<p>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0435\u0440\u0444\u043e\u043c\u0430\u043d\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u0439\u043f\u0447\u0435\u043a \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435, \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cs\">namespace $ {     export let $user_name: string = 'Anonymous' } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043b\u043e\u0433:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $log( this: $, ... params: unknown[] ) {         console.log( ... params )     } } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 <code>this<\/code>. \u041e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cs\">$log( 123 ) \/\/ Error <\/code><\/pre>\n<p>\u0412\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<pre><code class=\"cs\">$.$log( 123 ) \/\/ OK <\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u043a\u0430 \u0447\u0442\u043e <code>$<\/code> \u0443 \u043d\u0430\u0441 &#8212; \u044d\u0442\u043e \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441, \u0430 \u043d\u0435 \u0442\u0438\u043f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"cs\">namespace $ {     export type $ = typeof $ } <\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432 <code>this<\/code>, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $hello( this: $ ) {         this.$log( 'Hello ' + this.$user_name )     } } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u043b\u044e\u0431\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u041d\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u043b\u043e \u0441\u043c\u044b\u0441\u043b\u0430, \u043f\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0435\u0440\u0451\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439, \u043f\u0430\u0442\u0447\u0438\u0442 \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0435\u0439 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $ambient(         this: $,         over: Partial&amp;lt; $ &gt;,     ): $ {         const context = Object.create( this )         for( const field of Object.getOwnPropertyNames( over ) ) {             const descr = Object.getOwnPropertyDescriptor( over, field )!             Object.defineProperty( context, field, descr )         }         return context     } } <\/code><\/pre>\n<p><code>Object.create<\/code> \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u044b\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0451\u0442\u0441\u044f. \u0410 \u0432\u043e\u0442 <code>Object.assign<\/code> \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u0433\u0435\u0442\u0442\u0435\u0440\u044b, \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b. \u042d\u0442\u0430 \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u043d\u0430\u043c \u0435\u0449\u0451 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0430 \u043f\u043e\u043a\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_greets_anon_by_default( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          this.$hello()         this.$assert( logs, [ 'Hello Anonymous' ] )      } } <\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043e\u043d \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434 \u0441\u0435\u0431\u044f &#8212; \u043f\u0430\u0442\u0447\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>$log<\/code>, \u0447\u0442\u043e\u0431\u044b \u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0430 \u0432\u0441\u0435 \u043b\u043e\u0433\u0438 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e. \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432 \u043b\u043e\u0433\u0438 \u0432\u044b\u0432\u0435\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0430\u0441\u0435\u0440\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $assert&amp;lt; Value &gt;( a: Value, b: Value ) {          const sa = JSON.stringify( a, null, '\\t' )         const sb = JSON.stringify( b, null, '\\t' )          if( sa === sb ) return         throw new Error( `Not equal\\n${sa}\\n${sb}`)      } } <\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0442\u0435\u0441\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 <code>$.$test<\/code>. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0441\u043a\u043e\u043f\u043e\u043c:<\/p>\n<pre><code class=\"cs\">namespace $ {     export async function $test_run( this: $ ) {          for( const test of Object.values( this.$test ) ) {             await test.call( this.$isolated() )         }          this.$log( 'All tests passed' )     } } <\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435, \u0430 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c. \u042d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0433\u0434\u0435 \u0437\u0430\u043c\u043e\u043a\u0430\u043d\u044b \u0432\u0441\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u0447\u0442\u043e \u043e\u0431\u0449\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c (\u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0444\u0430\u0439\u043b\u044b, \u0440\u0430\u043d\u0434\u043e\u043c \u0438 \u0442.\u0434.). \u0418\u0441\u0445\u043e\u0434\u043d\u043e, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $isolated( this: $ ) {         return this.$ambient({})     } } <\/code><\/pre>\n<p>\u041d\u043e \u043d\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>$log<\/code> \u043f\u0438\u0448\u0435\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0447\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0440\u044f\u0434\u043e\u043c \u0441 \u043d\u0435\u0439 \u043c\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>$isolated<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 <code>$log<\/code> \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0441\u0430\u0439\u0434 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432:<\/p>\n<pre><code class=\"cs\">namespace $ {     const base = $isolated     $.$isolated = function( this: $ ) {         return base.call( this ).$ambient({             $log: ()=&gt; {}         })     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u043b\u044e\u0431\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0432 \u043d\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>$log<\/code>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438 \u0442\u0435\u0441\u0442, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_greets_overrided_name( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          const context = this.$ambient({ $user_name: 'Jin' })         context.$hello()         this.$hello()          this.$assert( logs, [ 'Hello Jin', 'Hello Anonymous' ] )      } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0432\u0432\u0435\u0434\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $thing {         constructor( private _$: $ ) {}         get $() { return this._$ }     } } <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u043c\u044b \u0438\u043d\u044a\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0418 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u0435\u0442\u0442\u0435\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u044a\u0451\u043c\u043e\u043c \u043a\u043e\u0434\u0430. \u0413\u0435\u0442\u0442\u0435\u0440 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432 \u043f\u043e\u0442\u043e\u043c\u043a\u0430\u0445 \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0432 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043a\u043e\u0432. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a \u0438\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a:<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $hello_card extends $thing {          get $() {             return super.$.$ambient({                 $user_name: super.$.$user_name + '!'             })         }          get user_name() {             return this.$.$user_name         }         set user_name( next: string ) {             this.$.$user_name = next         }          run() {             this.$.$hello()         }      } } <\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_card_greets_anon_with_suffix( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          const card = new $hello_card( this )         card.run()          this.$assert( logs, [ 'Hello Anonymous!' ] )      } } <\/code><\/pre>\n<p>\u0421\u0443\u043f\u0435\u0440, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0422\u0443\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0441\u0442\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439:<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $hello_page extends $thing {          get $() {             return super.$.$ambient({                 $user_name: 'Jin'             })         }          @ $mem         get Card() {             return new this.$.$hello_card( this.$ )         }          get user_name() {             return this.Card.user_name         }         set user_name( next: string ) {             this.Card.user_name = next         }          run() {             this.Card.run()         }      } } <\/code><\/pre>\n<p>\u0412\u044b\u043d\u043e\u0441\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043b\u0430\u0434\u0435\u0438\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u0418\u043d\u044a\u0435\u043a\u0442\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0418 \u043c\u0435\u043c\u043e\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>$mem<\/code>. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0430\u043c\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"cs\">namespace $ {     export function $mem(         host: object,         field: string,         descr: PropertyDescriptor,     ) {         const store = new WeakMap&amp;lt; object, any &gt;()          return {             ... descr,             get() {                  let val = store.get( this )                 if( val !== undefined ) return val                  val = descr.get!.call( this )                 store.set( this, val )                  return val             }         }      } } <\/code><\/pre>\n<p><code>WeakMap<\/code> \u043d\u0443\u0436\u0435\u043d \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0432 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043d\u0435 \u043b\u043e\u043c\u0430\u044f \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u044e. \u0427\u0442\u043e \u0436, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c, \u0430 \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0441\u044f:<\/p>\n<pre><code class=\"cs\">namespace $.test {     export function $hello_page_greets_overrided_name_with_suffix( this: $ ) {          const logs = [] as unknown[]         this.$log = logs.push.bind( logs )          const page = new $hello_page( this )         page.run()          this.$assert( logs, [ 'Hello Jin!' ] )      } } <\/code><\/pre>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 &#8212; \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0435\u0433\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<pre><code class=\"cs\">namespace $ {     export class $app_card extends $.$hello_card {          get $() {             const form = this             return super.$.$ambient({                 get $user_name() { return form.user_name },                 set $user_name( next: string ) { form.user_name = next }             })         }          get user_name() {             return super.$.$storage_local.getItem( 'user_name' ) ?? super.$.$user_name         }         set user_name( next: string ) {             super.$.$storage_local.setItem( 'user_name', next )         }      } } <\/code><\/pre>\n<p>\u0421\u0430\u043c\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 &#8212; \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043b\u0438\u0430\u0441 \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"cs\">namespace $ {     export const $storage_local: Storage = window.localStorage } <\/code><\/pre>\n<p>\u0410 \u0440\u0430\u0437 \u043e\u043d\u043e \u0443 \u043d\u0430\u0441 \u043f\u0435\u0440\u0441\u0438\u0441\u0442\u0438\u0442\u0441\u044f, \u0442\u043e<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-317790","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/317790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=317790"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/317790\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=317790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=317790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=317790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}