{"id":293966,"date":"2019-08-28T15:00:44","date_gmt":"2019-08-28T15:00:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=293966"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=293966","title":{"rendered":"TypeScript. \u041c\u0430\u0433\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">TypeScript \u2014 \u043f\u043e\u0438\u0441\u0442\u0438\u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u044f\u0437\u044b\u043a. \u0412 \u0435\u0433\u043e \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0418 \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433, \u043a\u043e\u043c\u0443-\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441\u0435\u043a\u0441-\u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u0442\u044e\u0434\u044b \u0441 JavaScript, \u0442\u043e \u043c\u0435\u043d\u044f \u043f\u043e\u0439\u043c\u0435\u0442. TypeScript \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u0439, \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u044e\u0442 \u0435\u0433\u043e \u043a\u0440\u0430\u0441\u043e\u0442\u0443, \u0444\u043e\u0440\u043c\u0443 \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u043e\u0432\u044b\u043c \u0441\u043c\u044b\u0441\u043b\u043e\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0435\u0447\u044c \u043e \u043d\u0438\u0445, \u043e\u0431 \u044d\u0442\u0438\u0445 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u044f\u0445, \u043e \u043c\u0430\u0433\u0438\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0434\u044b<\/h2>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430 N1.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435, \u043c\u043d\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u043f\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0433\u043b\u0430\u0437\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 Stack Overflow, github \u0438\u043b\u0438 \u0432\u043e\u0432\u0441\u0435 \u0431\u044b\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0448\u043b\u043e \u2014 \u044d\u0442\u043e \u0432\u0441\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/Microsoft\/TypeScript\/wiki\/What%27s-new-in-TypeScript\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/release-notes\/typescript-3-5.html\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u043e\u0448\u0443 \u043e\u0442\u043d\u0435\u0441\u0442\u0438\u0441\u044c \u0441 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c, \u0435\u0441\u043b\u0438 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u0412\u0430\u043c \u043f\u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438.<\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430 N2.<\/p>\n<p>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u0430 0.<\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430 N3.<\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438\u0441\u044c \u043f\u043e\u0434 tsc \u0432\u0435\u0440\u0441\u0438\u0438 3.4.5 \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 es5. \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">tsconfig.json<\/b><\/p>\n<div class=\"spoiler_text\">{<br \/>   \u00abcompilerOptions\u00bb: {<br \/>   \u00aboutFile\u00bb: &#171;.\/target\/result.js&#187;,<br \/>   \u00abmodule\u00bb: \u00abamd\u00bb,<br \/>   \u00abtarget\u00bb: \u00abes5\u00bb,<br \/>   \u00abdeclaration\u00bb: true,<br \/>   \u00abnoImplicitAny\u00bb: true,<br \/>   \u00abnoImplicitReturns\u00bb: true,<br \/>   \u00abstrictNullChecks\u00bb: true,<br \/>   \u00abstrictPropertyInitialization\u00bb: true,<br \/>   \u00abexperimentalDecorators\u00bb: true,<br \/>   \u00abemitDecoratorMetadata\u00bb: true,<br \/>   \u00abpreserveConstEnums\u00bb: true,<br \/>   \u00abnoResolve\u00bb: true,<br \/>   \u00absourceMap\u00bb: true,<br \/>   \u00abinlineSources\u00bb: true<br \/>   },<br \/>   \u00abinclude\u00bb: [<br \/>   &#171;.\/src&#187;<br \/>   ]<br \/>   }<\/p><\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 implements \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0442\u0438\u043f\u044b \u0438 <i>\u043a\u043b\u0430\u0441\u0441\u044b<\/i>. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/interfaces.html#interfaces-extending-classes\">\u0437\u0434\u0435\u0441\u044c<\/a><\/p>\n<pre><code class=\"plaintext\">    abstract class ClassA {         abstract getA(): string;     }      abstract class ClassB {         abstract getB(): string;     }      \/\/ \u0414\u0430, tsc \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u044d\u0442\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u0442     abstract class ClassC implements ClassA, ClassB {         \/\/                ^ \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 implements \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438.         abstract getA(): string;          abstract getB(): string;     } <\/code><\/pre>\n<p>  \u0414\u0443\u043c\u0430\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 TypeScript \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0438\u0441\u044c \u043e &#8216;\u0441\u0442\u0440\u043e\u0433\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430\u0445&#8217;, \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e class. \u041f\u0440\u0438\u0447\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c\u0438.<\/p>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 extends \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/release-notes\/typescript-1-6.html#extending-expressions\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438<\/a>. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u2014 \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 2\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 \u043d\u0435\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2014 \u0434\u0430.<\/p>\n<pre><code class=\"plaintext\">class One {     one = \"__one__\";     getOne(): string {         return \"one\";     } }  class Two {     two = \"__two__\";     getTwo(): string {         return \"two\";     } }  \/\/ \u0422\u0435\u0436\u0435 \u043c\u0438\u043a\u0441\u0438\u043d\u044b, \u043d\u043e \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0432\u0438\u0434\u0435: \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0432 IDE (\u043a\u0440\u043e\u043c\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u0435\u0439) \u0438 \u0430\u0432\u0442\u043e\u043a\u043e\u043c\u043f\u043b\u0438\u0442 \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e. class BothTogether extends mix(One, Two) {     \/\/                     ^ \u043d\u0430\u0445\u043e\u0434\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0447\u0430\u0441\u0442\u0438 extends \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f     info(): string {         return \"BothTogether: \" + this.getOne() + \" and \" + this.getTwo() + \", one: \" + this.one + \", two: \" + this.two;         \/\/                             ^ \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043e\u0442 IDE \u0437\u0434\u0435\u0441\u044c \u0438 ^ \u0438\u043c\u0435\u0435\u0442\u0441\u044f     } }  type FaceType&lt;T&gt; = {     [K in keyof T]: T[K]; };  type Constructor&lt;T&gt; = {     \/\/ prototype: T &amp; {[key: string]: any};     new(): T; };  \/\/ TODO: \u044d\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0433\u043b\u044f\u0434\u0435\u0442\u044c. \u041a\u043b\u0430\u0441\u0441\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0441\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 function mix&lt;O, T, Mix = O &amp; T&gt;(o: Constructor&lt;O&gt;, t: Constructor&lt;T&gt;): FaceType&lt;Mix&gt; &amp; Constructor&lt;Mix&gt; {     function MixinClass(...args: any) {         o.apply(this, args);         t.apply(this, args);     }     const ignoreNamesFilter = (name: string) =&gt; [\"constructor\"].indexOf(name) === -1;     [o, t].forEach(baseCtor =&gt; {         Object.getOwnPropertyNames(baseCtor.prototype).filter(ignoreNamesFilter).forEach(name =&gt; {             MixinClass.prototype[name] = baseCtor.prototype[name];         });     });     return MixinClass as any; }  const bt = new BothTogether(); window.console.log(bt.info()); \/\/ &gt;&gt; BothTogether: one and two, one: __one__, two: __two__ <\/code><\/pre>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: <i>\u0433\u043b\u0443\u0431\u043e\u043a\u0438\u0439<\/i> \u0438 \u0432 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0430\u043d\u043e\u043d\u0438\u043c.<\/p>\n<pre><code class=\"plaintext\">const \u0421lass = class extends class extends class extends class extends class {} {} {} {} {}; <\/code><\/pre>\n<p>  \u0410 \u043a\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u0441\u043b\u043e\u0432\u043e \u043a\u043b\u0430\u0441\u0441 \u0441 4 extends \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435?<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0415\u0441\u043b\u0438 \u0442\u0430\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">\/\/ tslint:disable const Class = class Class extends class Class extends class Class extends class Class extends class Class {} {} {} {} {}; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0410 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435?<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u043e\u0442 \u0442\u0430\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"plaintext\">\/\/ tslint:disable const \u0441lass = class Class&lt;Class&gt; extends class Class extends class Class extends class Class extends class Class {} {} {} {} {}; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>   \u041d\u0443 \u0412\u044b \u043f\u043e\u043d\u044f\u043b\u0438 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043b\u0430\u0441\u0441!<\/p>\n<h2>\u0412\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a \u2014 \u0431\u0435\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440<\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u0412\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 strictNullChecks \u0438 strictPropertyInitialization,<br \/>  \u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f \u043e \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0437\u043d\u0430\u043a\u0435 \u043f\u0440\u043e\u0448\u043b\u0438 \u0440\u044f\u0434\u043e\u043c \u0441 \u0412\u0430\u043c\u0438\u2026 \u041f\u043e\u043c\u0438\u043c\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u044b \u0435\u0449\u0435 2 \u0440\u043e\u043b\u0438.<\/p>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u0412\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a \u0432 \u0440\u043e\u043b\u0438 <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/release-notes\/typescript-2-0.html#non-null-assertion-operator\">Non-null assertion operator<\/a><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u043e\u043b\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c null \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 null. \u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"plaintext\"> \/\/ \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c --strictNullChecks  type OptType = {      maybe?: {          data: string;      };  };  \/\/ ...  function process(optType: OptType) {      completeOptFields(optType);      \/\/ \u041c\u044b \u0437\u043d\u0430\u0435\u043c \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 completeOptFields \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.      window.console.log(optType.maybe!.data);      \/\/                              ^ - \u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u0441\u0435\u0431\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 null      \/\/                                  \u0435\u0441\u043b\u0438 \u0443\u0431\u0435\u0440\u0435\u043c !, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0442 tsc: Object is possibly 'undefined'  }   function completeOptFields(optType: OptType) {      if (!optType.maybe) {          optType.maybe = {              data: \"some default info\"          };      }  } <\/code><\/pre>\n<p>  \u0418\u0442\u043e\u0433\u043e, \u044d\u0442\u043e\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 null \u0432 \u043a\u043e\u0434\u0435, \u0435\u0441\u043b\u0438 \u043c\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b\u2026<\/p>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u0412\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a \u0432 \u0440\u043e\u043b\u0438 <a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/release-notes\/typescript-2-7.html#definite-assignment-assertions\">Definite assignment assertion modifier<\/a><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0442\u043e\u043c, \u0433\u0434\u0435-\u0442\u043e \u0432 \u043a\u043e\u0434\u0435, \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 strictPropertyInitialization. \u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"plaintext\">\/\/ \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c --strictPropertyInitialization class Field {     foo!: number;     \/\/ ^     \/\/ Notice this '!' modifier.     \/\/ This is the \"definite assignment assertion\"      constructor() {         this.initialize();     }      initialize() {         this.foo = 0;         \/\/       ^ \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0434\u0435\u0441\u044c     } } <\/code><\/pre>\n<p>  \u041d\u043e \u0432\u0441\u044f \u044d\u0442\u0430 \u043c\u0438\u043d\u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u043e \u0432\u043e\u0441\u043a\u043b\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u043d\u0430\u043a \u043d\u0435 \u0438\u043c\u0435\u043b\u0430 \u0431\u044b \u0441\u043c\u044b\u0441\u043b\u0430 \u0431\u0435\u0437 \u043c\u0438\u043d\u0443\u0442\u043a\u0438 \u044e\u043c\u043e\u0440\u0430.<\/p>\n<p>  \u0412\u043e\u043f\u0440\u043e\u0441: \u041a\u0430\u043a \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435?<\/p>\n<pre><code class=\"plaintext\">\/\/ \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c --strictNullChecks type OptType = {     maybe?: {         data: string;     }; }; function process(optType: OptType) {     if (!!!optType.maybe!!!) {         window.console.log(\"Just for fun\");     }     window.console.log(optType.maybe!!!!.data); } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0442\u0432\u0435\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\u0414\u0430<\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u0422\u0438\u043f\u044b<\/h2>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439, \u043a\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u0412\u043e\u0442 \u0438 \u043c\u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e.<\/p>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u043d\u0430 \u043f\u043e\u0434\u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.<\/p>\n<pre><code class=\"plaintext\">type Person = {     id: string;     name: string;     address: {         city: string;         street: string;         house: string;     } };  type Address = Person[\"address\"]; <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0412\u044b \u043f\u0438\u0448\u0438\u0442\u0435 \u0442\u0438\u043f\u044b \u0441\u0430\u043c\u0438, \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0432\u0440\u044f\u0434 \u043b\u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b. \u041d\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u0442\u0438\u043f \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u043f\u043e\u0434\u0442\u0438\u043f \u2014 \u043d\u0435\u0442.<\/p>\n<p>  \u0422\u0440\u044e\u043a \u0441 \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0434\u043b\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0443 \u0412\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 generic \u0442\u0438\u043f\u043e\u043c, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u044b. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0438\u0436\u0435 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435<\/p>\n<pre><code class=\"plaintext\">class BaseDialog&lt;In, Out&gt; {      show(params: In): Out {\/** \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u0434. \u0412 \u043a\u043e\u043d\u0446\u0435 return ... *\/ } }  \/\/ \u0414\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u043f\u043e-\u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435 class PersonDialogOld extends BaseDialog&lt;Person[], string&gt; {\/** \u043a\u043e\u0434 \u0437\u0434\u0435\u0441\u044c *\/}  \/\/ \u041f\u043e\u0432\u044b\u0448\u0430\u0435\u043c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c class PersonDialog extends BaseDialog&lt;Person[], Person[\"id\"]&gt; {\/** \u043a\u043e\u0434 \u0437\u0434\u0435\u0441\u044c *\/} <\/code><\/pre>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 TypeScript \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043d\u0443\u0436\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0421\u043b\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0437\u043d\u0430\u044e. \u0414\u043e\u043b\u0433\u043e \u0434\u0443\u043c\u0430\u043b \u043d\u0430\u0434 \u044d\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u043e\u0439. \u041f\u043e\u043a\u0430\u0436\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 Builder, \u043a\u0430\u043a \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"plaintext\">class SimpleBuilder {      private constructor() {}      static create(): SimpleBuilder {         return new SimpleBuilder();     }      firstName(firstName: string): this {         return this;     }      lastName(lastName: string): this {         return this;     }      middleName(midleName: string): this {         return this;     }      build(): string {         return \"what you needs\";     } }  const builder = SimpleBuilder.create(); \/\/ \u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442. const result = builder.firstName(\"F\").lastName(\"L\").middleName(\"M\").build(); <\/code><\/pre>\n<p>  \u041f\u043e\u043a\u0430 \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 create, \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 ts. \u0421\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0443\u0436\u043d\u043e \u043d\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u0442\u0440\u043e\u0433\u043e 1 \u0440\u0430\u0437. \u041f\u0440\u0438\u0447\u0435\u043c \u0412\u0430\u0448\u0430 IDE \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c. \u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0443 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 builder \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445. \u0414\u043e\u0441\u0442\u0438\u0447\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0442\u0438\u043f NarrowCallside.<\/p>\n<pre><code class=\"plaintext\">type ExcludeMethod&lt;T, K extends keyof T&gt; = Pick&lt;T, Exclude&lt;keyof T, K&gt;&gt;;  type NarrowCallside&lt;T&gt; = {     [P in keyof T]: T[P] extends (...args: any) =&gt; T ?         ReturnType&lt;T[P]&gt; extends T ?         (...args: Parameters&lt;T[P]&gt;) =&gt; NarrowCallside&lt;ExcludeMethod&lt;T, P&gt;&gt;         : T[P]         : T[P]; };  class SimpleBuilder {      private constructor() {}      static create(): NarrowCallside&lt;SimpleBuilder&gt; {         return new SimpleBuilder();     }      firstName(firstName: string): this {         return this;     }      lastName(lastName: string): this {         return this;     }      middleName(midleName: string): this {         return this;     }      build(): string {         return \"what you needs\";     } }  const builder = SimpleBuilder.create(); const result = builder.firstName(\"F\") \/\/                    ^ - \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b                 .lastName(\"L\") \/\/              ^ - \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b lastName, middleName \u0438 build             .middleName(\"M\") \/\/          ^ - \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b middleName \u0438 build         .build(); \/\/      ^ - \u0437\u0434\u0435\u0441\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e build <\/code><\/pre>\n<p>  <b>\u041d\u0430\u0445\u043e\u0434\u043a\u0430<\/b>: \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u043e\u0432 TypeScript \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u0430 DirectCallside \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e.<\/p>\n<pre><code class=\"plaintext\">type FilterKeys&lt;T&gt; = ({[P in keyof T]: T[P] extends (...args: any) =&gt; any ? ReturnType&lt;T[P]&gt; extends never ? never : P : never })[keyof T]; type FilterMethods&lt;T&gt; = Pick&lt;T, FilterKeys&lt;T&gt;&gt;;  type BaseDirectCallside&lt;T, Direct extends any[]&gt; = FilterMethods&lt;{     [Key in keyof T]: T[Key] extends ((...args: any) =&gt; T) ?         ((..._: Direct) =&gt; any) extends ((_: infer First, ..._1: infer Next) =&gt; any) ?         First extends Key ?         (...args: Parameters&lt;T[Key]&gt;) =&gt; BaseDirectCallside&lt;T, Next&gt;     : never     : never     : T[Key] }&gt;;  type DirectCallside&lt;T, P extends Array&lt;keyof T&gt;&gt; = BaseDirectCallside&lt;T, P&gt;;  class StrongBuilder {      private constructor() {}      static create(): DirectCallside&lt;StrongBuilder, [\"firstName\", \"lastName\", \"middleName\"]&gt; {         return new StrongBuilder() as any;     }      firstName(firstName: string): this {         return this;     }      lastName(lastName: string): this {         return this;     }      middleName(midleName: string): this {         return this;     }      build(): string {         return \"what you needs\";     } }  const sBuilder = StrongBuilder.create(); const sResult = sBuilder.firstName(\"F\") \/\/                      ^ - \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e firstName \u0438 build                     .lastName(\"L\") \/\/                  ^ - \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e lastName \u0438 build                 .middleName(\"M\") \/\/              ^ - \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e middleName \u0438 build             .build(); \/\/          ^ - \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e build <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p>  \u042d\u0442\u043e \u0432\u0441\u0435 \u043c\u043e\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u043f\u043e TypeScript \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f. \u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u0434\u043e \u043d\u043e\u0432\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447.<\/p><\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \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\/465267\/\"> https:\/\/habr.com\/ru\/post\/465267\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">TypeScript \u2014 \u043f\u043e\u0438\u0441\u0442\u0438\u043d\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u044f\u0437\u044b\u043a. \u0412 \u0435\u0433\u043e \u0430\u0440\u0441\u0435\u043d\u0430\u043b\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0418 \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433, \u043a\u043e\u043c\u0443-\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441\u0435\u043a\u0441-\u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u0442\u044e\u0434\u044b \u0441 JavaScript, \u0442\u043e \u043c\u0435\u043d\u044f \u043f\u043e\u0439\u043c\u0435\u0442. TypeScript \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u0439, \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u0432\u043e\u0441\u0445\u0438\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u044e\u0442 \u0435\u0433\u043e \u043a\u0440\u0430\u0441\u043e\u0442\u0443, \u0444\u043e\u0440\u043c\u0443 \u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u043e\u0432\u044b\u043c \u0441\u043c\u044b\u0441\u043b\u043e\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0440\u0435\u0447\u044c \u043e \u043d\u0438\u0445, \u043e\u0431 \u044d\u0442\u0438\u0445 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u044f\u0445, \u043e \u043c\u0430\u0433\u0438\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c.  <\/p>\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-293966","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293966","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=293966"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293966\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=293966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=293966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=293966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}