{"id":343149,"date":"2022-12-26T15:00:18","date_gmt":"2022-12-26T15:00:18","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=343149"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=343149","title":{"rendered":"<span>React + TypeScript: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/bb\/gp\/sy\/bbgpsy6sug4wqfpa4b9pgwl1lmy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/bb\/gp\/sy\/bbgpsy6sug4wqfpa4b9pgwl1lmy.png\"\/>  <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 <a href=\"https:\/\/profy.dev\/article\/react-typescript\">\u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 React-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0441\u0435\u0431\u044f: \u043d\u0430\u0434\u043e \u043b\u0438 \u043c\u043d\u0435 \u0443\u0447\u0438\u0442\u044c TypeScript? \u0415\u0449\u0435 \u043a\u0430\u043a \u043d\u0430\u0434\u043e!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f TS \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u0430\u0448\u0438 \u0448\u0430\u043d\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0430\u0442\u0441\u044f;<\/li>\n<li>\u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0430\u0433\u043e\u0432, \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c;<\/li>\n<li>\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u0434 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e TS \u0432 React.<\/p>\n<p>  <\/p>\n<p>\u0410\u043d\u0442\u0438\u0433\u0435\u0440\u043e\u0435\u043c \u043d\u0430\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u041f\u044d\u0442 \u2014 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"osnovy-ts-neobhodimye-v-react\">\u041e\u0441\u043d\u043e\u0432\u044b TS, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0432 React<\/h2>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 3 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">string \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \"Pat\" boolean \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, true number \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 23 \u0438\u043b\u0438 1.99<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041c\u0430\u0441\u0441\u0438\u0432\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">number[] \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, [1, 2, 3] string[] \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, [\"Lisa\", \"Pat\"] User[] \/\/ \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0442\u0438\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, [{ name: \"Pat\" }, { name: \"Lisa\" }]<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u044a\u0435\u043a\u0442\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0432\u0441\u044e\u0434\u0443. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = {   firstName: \"Pat\",   age: 23,   isNice: false,   role: \"CTO\",   skills: [\"HTML\", \"CSS\", \"jQuery\"] }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0438\u043f, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   firstName: string;   age: number;   isNice: boolean;   role: string;   skills: string[]; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0437\u044c\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   \/\/ ...   friends: User[]; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u044d\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0432\u0438\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043d\u0435\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0431\u044b\u0442\u044c \u0434\u0440\u0443\u0437\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const user = {   firstName: \"Pat\",   age: 23,   isNice: false,   role: \"CTO\",   skills: [\"CSS\", \"HTML\", \"jQuery\"],   friends: undefined, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 TS \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e (\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e) \u043f\u043e\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b <code>?<\/code> \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   \/\/ ...   friends?: User[]; }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0442\u0438\u043f \u043f\u043e\u043b\u044f <code>role<\/code> \u043a\u0430\u043a <code>string<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   \/\/ ...   role: string; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u044d\u0442\u0443 \u044d\u0442\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u041e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0438\u043f <code>string<\/code> \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0440\u043e\u0433\u0438\u0439. \u0415\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 (enumeration, enum):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">enum UserRole {   CEO,   CTO,   SUBORDINATE, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435. \u041d\u043e \u041f\u044d\u0442 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0438\u0441\u043b\u0430. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>CEO<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>0<\/code>, <code>CTO<\/code> \u2014 <code>1<\/code>, \u0430 <code>SUBORDINATE<\/code> \u2014 <code>2<\/code>. \u041f\u044d\u0442\u0443 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e \u0434\u0443\u0448\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">enum UserRole {   CEO = \"ceo\",   CTO = \"cto\",   SUBORDINATE = \"inferior-person\", }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u041f\u044d\u0442 \u0434\u043e\u0432\u043e\u043b\u0435\u043d:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">enum UserRole {   CEO = \"ceo\",   CTO = \"cto\",   SUBORDINATE = \"inferior-person\", }  type User = {   firstName: string;   age: number;   isNice: boolean;   role: UserRole;   skills: string[];   friends?: User[]; }  const user = {   firstName: \"Pat\",   age: 23,   isNice: false,   role: UserRole.CTO, \/\/ \u0440\u0430\u0432\u043d\u044f\u0435\u0442\u0441\u044f \"cto\"   skills: [\"HTML\", \"CSS\", \"jQuery\"], }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0424\u0443\u043d\u043a\u0446\u0438\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u044d\u0442 \u043b\u044e\u0431\u0438\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0432\u043b\u0430\u0441\u0442\u044c, \u0443\u0432\u043e\u043b\u044c\u043d\u044f\u044f \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0443\u044e \u041f\u044d\u0442\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e.<\/p>\n<p>  <\/p>\n<p><em>\u0422\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/em><\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, 3 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0432\u043e\u043b\u044c\u043d\u044f\u0435\u043c\u043e\u0435 \u043b\u0438\u0446\u043e. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function fireUser(firstName: string, age: number, isNice: boolean) {   \/\/ ... }  \/\/ \u0438\u043b\u0438 \u0442\u0430\u043a const fireUser = (firstName: string, age: number, isNice: boolean) => {   \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f\u044b \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function fireUser({ firstName, age, isNice }: {   firstName: string;   age: number;   isNice: boolean; }) {   \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f. \u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0442\u0430\u043a\u0430\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0430 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 React:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   firstName: string;   age: number;   role: UserRole; }  function fireUser({ firstName, age, role }: User) {   \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u0422\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439<\/em><\/p>\n<p>  <\/p>\n<p>\u041f\u044d\u0442 \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0438\u0434\u0435\u0435\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u0442\u0430\u043a\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>: Type<\/code> \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u043a\u043e\u0431\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function fireUser(firstName: string, age: number, role: UserRole): User {   \/\/ ...   return { firstName, age, role }; }  \/\/ \u0438\u043b\u0438 \u0442\u0430\u043a const fireUser = (firstName: string, age: number, role: UserRole): User => {   \/\/ ...   return { firstName, age, role }; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c <code>null<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/rv\/75\/wp\/rv75wpwcl31enskrzpfw9vj2evk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/rv\/75\/wp\/rv75wpwcl31enskrzpfw9vj2evk.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439, \u044f\u0432\u043d\u043e. TS \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c (\u0432\u044b\u0432\u043e\u0434\u043e\u043c) \u0442\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ny\/ud\/3-\/nyud3-phtk2y9nskpoidhhcq33c.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ny\/ud\/3-\/nyud3-phtk2y9nskpoidhhcq33c.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u043e\u0433\u043e TS \u0442\u0438\u043f\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430\u043c \u043a\u043e\u0434\u0430).<\/p>\n<p>  <\/p>\n<p><strong>\u0414\u0440\u0443\u0433\u0438\u0435 \u0432\u0435\u0449\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 TS \u0432 React. \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u043c\u0438 \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/2\/everyday-types.html#union-types\"><code>\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (unions \u2014 TypeA | TypeB<\/code>)<\/a>;<\/li>\n<li><a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/utility-types.html#recordkeys-type\"><code>\u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 Record&lt;TypeA, TypeB><\/code><\/a>.<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"react-i-ts\">React \u0438 TS<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 TS \u0432 React, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 \u0445\u0443\u043a\u0438 React \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 \u043f\u0440\u043e\u043f\u044b \u2014 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<p>  <\/p>\n<p><em>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/em><\/p>\n<p>  <\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u0438\u043f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function UserProfile() {   return &lt;div>If you're Pat: YOU'RE AWESOME!!&lt;\/div> }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u043e\u043c, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>JSX.Element<\/code>, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/fh\/0h\/rm\/fh0hrmfsry8w2gwsto6f4vfaq8w.png\" data-src=\"https:\/\/habrastorage.org\/webt\/fh\/0h\/rm\/fh0hrmfsry8w2gwsto6f4vfaq8w.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0435 <code>JSX<\/code>, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ns\/yc\/mt\/nsycmt_x1u8ltspmx7sc2hcixnq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ns\/yc\/mt\/nsycmt_x1u8ltspmx7sc2hcixnq.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 <code>user<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c <code>JSX<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">'UserProfile' cannot be used as a JSX component. Its return type 'User' is not a valid JSX element.<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041f\u0440\u043e\u043f\u044b<\/em><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, \u043f\u0440\u043e\u043f\u044b \u2014 \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">enum UserRole {   CEO = \"ceo\",   CTO = \"cto\",   SUBORDINATE = \"inferior-person\", }  type UserProfileProps = {   firstName: string;   role: UserRole; }  function UserProfile({ firstName, role }: UserProfileProps) {     if (role === UserRole.CTO) {     return &lt;div>Hey Pat, you're AWESOME!!&lt;\/div>   }   return &lt;div>Hi {firstName}, you suck!&lt;\/div> }  \/\/ \u0438\u043b\u0438 \u0442\u0430\u043a const UserProfile = ({ firstName, role }: UserProfileProps) => {     if (role === UserRole.CTO) {     return &lt;div>Hey Pat, you're AWESOME!!&lt;\/div>   }   return &lt;div>Hi {firstName}, you suck!&lt;\/div> }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0434 React-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0432\u044b, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0438\u043f <code>React.FC<\/code> \u0438\u043b\u0438 <code>React.FunctionComponent<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const UserProfile: React.FC&lt;UserProfileProps>({ firstName, role }) {   \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0442\u0438\u043f\u044b <a href=\"https:\/\/github.com\/facebook\/create-react-app\/pull\/8177\">\u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f<\/a>.<\/p>\n<p>  <\/p>\n<p><em>\u041f\u0440\u043e\u043f\u044b-\u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438<\/em><\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u043f\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 (\u043a\u043e\u043b\u043b\u0431\u044d\u043a\u0438):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type UserProfileProps = {   id: string;   firstName: string;   role: UserRole;   fireUser: (id: string) => void; };  function UserProfile({ id, firstName, role, fireUser }: UserProfileProps) {   if (role === UserRole.CTO) {     return &lt;div>Hey Pat, you're AWESOME!!&lt;\/div>;   }   return (     &lt;>       &lt;div>Hi {firstName}, you suck!&lt;\/div>       &lt;button onClick={() => fireUser(id)}>Fire this loser!&lt;\/button>     &lt;\/>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p><code>void<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p><em>\u0414\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u043f\u0440\u043e\u043f\u044b<\/em><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>?<\/code>. \u0422\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u0440\u043e\u043f\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type UserProfileProps = {   age: number;   role?: UserRole; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u043f \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function UserProfile({ firstName, role = UserRole.SUBORDINATE }: UserProfileProps) {   if (role === UserRole.CTO) {     return &lt;div>Hey Pat, you're AWESOME!!&lt;\/div>   }   return &lt;div>Hi {firstName}, you suck!&lt;\/div> }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"huki\">\u0425\u0443\u043a\u0438<\/h2>\n<p>  <\/p>\n<p><em>useState()<\/em><\/p>\n<p>  <\/p>\n<p><code>useState<\/code> \u2014 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0445\u0443\u043a React. \u0412\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0435\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. TS \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0442\u0438\u043f\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 <code>useState()<\/code>, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function UserProfile({ firstName, role }: UserProfileProps) {   const [isFired, setIsFired] = useState(false);    return (     &lt;>       &lt;div>Hi {firstName}, you suck!&lt;\/div>       &lt;button onClick={() => setIsFired(!isFired)}>         {isFired ? \"Oops, hire them back!\" : \"Fire this loser!\"}       &lt;\/button>     &lt;\/>   ); }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/oj\/pu\/hp\/ojpuhpr7ol7nwtb5wgu69g3vqpy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/oj\/pu\/hp\/ojpuhpr7ol7nwtb5wgu69g3vqpy.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0432 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ly\/cr\/4k\/lycr4kugtflokenb2anylp6u-54.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ly\/cr\/4k\/lycr4kugtflokenb2anylp6u-54.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 TS \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 <code>useState()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ TS \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 const [names, setNames] = useState([]);  \/\/ \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f `undefined`, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 TS \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0442\u0438\u043f const [user, setUser] = useState();  \/\/ \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0434\u043b\u044f `null` \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f const user = useState(null);<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/aa\/xr\/-k\/aaxr-ksy0oemed6q6ah0ro8qa1q.png\" data-src=\"https:\/\/habrastorage.org\/webt\/aa\/xr\/-k\/aaxr-ksy0oemed6q6ah0ro8qa1q.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p><code>useState()<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0449\u0435\u0433\u043e \u0442\u0438\u043f\u0430 (\u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430, generic type). \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u043b\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \u0442\u0438\u043f\u043e\u043c `names` \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f `string[]` const [names, setNames] = useState&lt;string[]>([]); setNames([\"Pat\", \"Lisa\"]);  \/\/ \u0442\u0438\u043f\u043e\u043c user \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f `User | undefined` const [user, setUser] = useState&lt;User>(); setUser({ firstName: \"Pat\", age: 23, role: UserRole.CTO }); setUser(undefined);  \/\/ \u0442\u0438\u043f\u043e\u043c `user` \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f `User | null` const [user, setUser] = useState&lt;User | null>(null); setUser({ firstName: \"Pat\", age: 23, role: UserRole.CTO }); setUser(null);<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0445\u0443\u043a\u0438, \u043e\u043d\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c <code>useEffect()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><em>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0445\u0443\u043a\u0438<\/em><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0445\u0443\u043a \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function useFireUser(firstName: string) {     const [isFired, setIsFired] = useState(false);   const hireAndFire = () => setIsFired(!isFired);      return {     text: isFired ? `Oops, hire ${firstName} back!` : \"Fire this loser!\",     hireAndFire,   }; }  function UserProfile({ firstName, role }: UserProfileProps) {   const { text, hireAndFire } = useFireUser(firstName);    return (     &lt;>       &lt;div>Hi {firstName}, you suck!&lt;\/div>       &lt;button onClick={hireAndFire}>         {text}       &lt;\/button>     &lt;\/>   ); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"sobytiya\">\u0421\u043e\u0431\u044b\u0442\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>\u0421\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 React \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043b\u0435\u0433\u043a\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 TS \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0442\u0438\u043f\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function FireButton() {   return (     &lt;button onClick={(event) => event.preventDefault()}>       Fire this loser!     &lt;\/button>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0435\u043b\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function FireButton() {   const onClick = (event: \/* ??? *\/) => {     event.preventDefault();   };    return (     &lt;button onClick={onClick}>       Fire this loser!     &lt;\/button>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0438\u043c\u0435\u0435\u0442 <code>event<\/code>? \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2 \u043f\u043e\u0434\u0445\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0433\u0443\u0433\u043b\u0438\u0442\u044c (\u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0433\u043e\u043b\u043e\u0432\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435));<\/li>\n<li>\u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c TS \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0442\u0438\u043f\u044b:<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ql\/ii\/qi\/qliiqi0ljlt0njwxfwqxsnht3fm.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/ql\/ii\/qi\/qliiqi0ljlt0njwxfwqxsnht3fm.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0421\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u0439 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u043d\u0433. \u041d\u0430\u043c \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 (\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430\u043c\u0438, \u043a\u0430\u043a <code>useState()<\/code>).<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function FireButton() {   const onClick = (event: React.MouseEvent&lt;HTMLButtonElement, MouseEvent>) => {     event.preventDefault();   };    return (     &lt;button onClick={onClick}>       Fire this loser!     &lt;\/button>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u043f\u0443\u0442\u0430?<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function Input() {   const onChange = (event: React.ChangeEvent&lt;HTMLInputElement>) => {     console.log(event.target.value);   };    return &lt;input onChange={onChange} \/>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0441\u0435\u043b\u0435\u043a\u0442\u0430?<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function Select() {   const onChange = (event: React.ChangeEvent&lt;HTMLSelectElement>) => {     console.log(event.target.value);   };    return &lt;select onChange={onChange}>...&lt;\/select>; }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"dochernie-komponenty\">\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0432\u0441\u0435 \u0432 \u0432\u043e\u0441\u0442\u043e\u0440\u0433\u0435, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u0440\u043e\u043f\u0430 <code>children<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type LayoutProps = {   children: React.ReactNode; };  function Layout({ children }: LayoutProps) {   return &lt;div>{children}&lt;\/div>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0438\u043f <code>React.ReactNode<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e (\u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yo\/n0\/ff\/yon0ff_6pxdzcd0nnytlfukjuks.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yo\/n0\/ff\/yon0ff_6pxdzcd0nnytlfukjuks.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430, \u0442\u0438\u043f <code>children<\/code> \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0434\u043e <code>React.ReactElement<\/code> \u0438\u043b\u0438 <code>JSX.Element<\/code> (\u0447\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e\u0436\u0435):<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type LayoutProps = {   children: React.ReactElement; \/\/ \u0438\u043b\u0438 `JSX.Element` };<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u0442\u0438\u043f\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u043c\u0438:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/-j\/-q\/uq\/-j-quqxycnth6dnpujuucjx9w08.png\" data-src=\"https:\/\/habrastorage.org\/webt\/-j\/-q\/uq\/-j-quqxycnth6dnpujuucjx9w08.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<h2 id=\"storonnie-biblioteki\">\u0421\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h2>\n<p>  <\/p>\n<p><strong>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 (\u0441 \u0442\u0438\u043f\u0430\u043c\u0438) \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/DefinitelyTyped\/DefinitelyTyped\">DefinitelyTyped<\/a> \u043d\u0430 GitHub \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0434 \u044d\u0433\u0438\u0434\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 <code>@types<\/code> (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0442\u0438\u043f\u044b React). \u041f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u0435\u0437 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0435\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/m_\/em\/ak\/m_emak2fek801_vodu5krxsoqka.png\" data-src=\"https:\/\/habrastorage.org\/webt\/m_\/em\/ak\/m_emak2fek801_vodu5krxsoqka.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0435\u0435 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">npm i --save-dev @types\/styled-components<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u0441\u0435 \u0436\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 <code>.d.ts<\/code> (\u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<p>  <\/p>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432<\/strong><\/p>\n<p>  <\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u044b \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0433\u0438\u0431\u043a\u0438\u043c\u0438. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438. \u041c\u044b \u0438\u0445 \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432 <code>useState()<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const [names, setNames] = useState&lt;string[]>([]);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u041f\u0440\u0438\u043c\u0435\u0440 \u0441 Axios:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import axios from \"axios\"  async function fetchUser() {   const response = await axios.get&lt;User>(\"https:\/\/example.com\/api\/user\");   return response.data; }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/1y\/22\/xx\/1y22xxaoubtvy1ie6ajlbi_ndlm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/1y\/22\/xx\/1y22xxaoubtvy1ie6ajlbi_ndlm.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>React Query:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import { useQuery } from \"@tanstack\/react-query\";  function UserProfile() {   \/\/ \u043e\u0431\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0448\u0438\u0431\u043a\u0438   const { data, error } = useQuery&lt;User, Error>([\"user\"], () => fetchUser());    if (error) {     return &lt;div>Error: {error.message}&lt;\/div>;   }   \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>Styled Components:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">import styled from \"styled-components\";  \/\/ \u043e\u0431\u0449\u0438\u0439 \u0442\u0438\u043f \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u043e\u0432 const MenuItem = styled.li&lt;{ isActive: boolean }>`   background: ${(props) => (props.isActive ? \"red\" : \"gray\")}; `;  function Menu() {   return (     &lt;ul>       &lt;MenuItem isActive>Menu Item 1&lt;\/MenuItem>     &lt;\/ul>   ); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"sposoby-ustraneniya-nepoladok\">\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u043b\u0430\u0434\u043e\u043a<\/h2>\n<p>  <\/p>\n<p><strong>\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 React &amp; TS<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e React-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 TS \u2014 \u0434\u0435\u043b\u043e \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b Vite + React + TS \u0438\u043b\u0438 Next.js + TS:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">npm create vite [project-name] --template react-ts  npx create-next-app [project-name] --ts<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u044d\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438, \u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0435\u0449\u0435 \u0440\u0430\u0437: \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u043c TS \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ql\/ii\/qi\/qliiqi0ljlt0njwxfwqxsnht3fm.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/ql\/ii\/qi\/qliiqi0ljlt0njwxfwqxsnht3fm.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u043c <code>(...args) =><\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ya\/ip\/te\/yaiptegmkbbds6fk2abuzbloykw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ya\/ip\/te\/yaiptegmkbbds6fk2abuzbloykw.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u0442\u0438\u043f\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0432 IDE. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c CTRL + \u041f\u0440\u043e\u0431\u0435\u043b (Windows) \u0438\u043b\u0438 Option + \u041f\u0440\u043e\u0431\u0435\u043b (Mac):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/sr\/gd\/zf\/srgdzfil9nblft8wnf7ku6cqjim.png\" data-src=\"https:\/\/habrastorage.org\/webt\/sr\/gd\/zf\/srgdzfil9nblft8wnf7ku6cqjim.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0442\u0438\u043f\u0430, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u044c CTRL + Click (Windows) \u0438\u043b\u0438 CMD + Click (Mac):<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jt\/hp\/el\/jthpelymlud8fq4xfyuytjoinhw.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/jt\/hp\/el\/jthpelymlud8fq4xfyuytjoinhw.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f TS \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function Input() {   return &lt;input \/>; }  function Form() {   return (     &lt;form>       &lt;Input onChange={() => console.log(\"change\")} \/>     &lt;\/form>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 TS:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5t\/qt\/tv\/5tqttvywbbj6tyvrftoifm3wuws.png\" data-src=\"https:\/\/habrastorage.org\/webt\/5t\/qt\/tv\/5tqttvywbbj6tyvrftoifm3wuws.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442? \u0427\u0442\u043e \u0435\u0449\u0435 \u0437\u0430 \u0442\u0438\u043f <code>IntrinsicAttributes<\/code>? \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0441 \u0441\u0430\u043c\u0438\u043c React) \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432, \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0439 \u0441\u043e\u0432\u0435\u0442: \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0438\u0445 \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443.<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Property 'onChange' does not exist on type...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code>Input<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function Input() {   return &lt;input \/>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043f\u0440\u043e\u043f\u0430 <code>onChange<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e &#171;\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f&#187; TS.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const MenuItem = styled.li`   background: \"red\"; `;  function Menu() {   return &lt;MenuItem isActive>Menu Item&lt;\/MenuItem>; }<\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/md\/1u\/w-\/md1uw-10zdvr7msymks8pjh3_ci.png\" data-src=\"https:\/\/habrastorage.org\/webt\/md\/1u\/w-\/md1uw-10zdvr7msymks8pjh3_ci.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0435\u0431\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435! \u0411\u0435\u0437 \u043f\u0430\u043d\u0438\u043a\u0438: \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u043d\u0435\u0446 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u2014 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043e\u0442\u0432\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0430\u043c:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lg\/-7\/ua\/lg-7uagpwsxweefircxq2xatcg0.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/lg\/-7\/ua\/lg-7uagpwsxweefircxq2xatcg0.gif\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0442\u0438\u043f <code>User<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>types.ts<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">export type User = {   firstName: string;   role: UserRole; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u043e\u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code>UserProfile<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function UserProfile({ firstName, role }: User) {   \/\/ ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 <code>UserPage<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function UserPage() {   const user = useFetchUser();    return &lt;UserProfile {...user} \/>; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043a\u0430 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <code>UserProfile<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u043f \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>fireUser<\/code>?<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function UserProfile({ firstName, role, fireUser }: User) {   return (     &lt;>       &lt;div>Hi {firstName}, you suck!&lt;\/div>       &lt;button onClick={() => fireUser({ firstName, role })}>         Fire this loser!       &lt;\/button>     &lt;\/>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zg\/m1\/4v\/zgm14vhh2f-f-vgmvqif05w6n94.png\" data-src=\"https:\/\/habrastorage.org\/webt\/zg\/m1\/4v\/zgm14vhh2f-f-vgmvqif05w6n94.png\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f (intersection type). \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0442\u0438\u043f. \u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 <code>&amp;<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   firstName: string;   role: UserRole; }  \/\/ `UserProfileProps` \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f `User` \u0438 `fireUser` type UserProfileProps = User &amp; {     fireUser: (user: User) => void; }  function UserProfile({ firstName, role, fireUser }: UserProfileProps) {   return (     &lt;>       &lt;div>Hi {firstName}, you suck!&lt;\/div>       &lt;button onClick={() => fireUser({ firstName, role })}>         Fire this loser!       &lt;\/button>     &lt;\/>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 &#171;\u0447\u0438\u0441\u0442\u044b\u043c&#187; \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u043f\u0440\u043e\u043f\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">type User = {   firstName: string;   role: UserRole; }  \/\/ ! type UserProfileProps = {   user: User;   fireUser: (user: User) => void; }  function UserProfile({ user, onClick }: UserProfileProps) {   return (     &lt;>       &lt;div>Hi {user.firstName}, you suck!&lt;\/div>       &lt;button onClick={() => fireUser(user)}>         Fire this loser!       &lt;\/button>     &lt;\/>   ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/my-js.org\/docs\/guide\/ts\/\">\u041a\u0430\u0440\u043c\u0430\u043d\u043d\u0430\u044f \u043a\u043d\u0438\u0433\u0430 \u043f\u043e TypeScript<\/a>;<\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/cheatsheet\/ts\/\">\u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e TypeScript<\/a>;<\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/cheatsheet\/mastering-ts\/\">TypeScript \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445<\/a>;<\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/cheatsheet\/react-typescript\/\">\u0428\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e React + TypeScript<\/a>;<\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/cheatsheet\/react-types\/\">\u0412\u044b\u0434\u0435\u0440\u0436\u043a\u0438 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043e\u0432 TypeScript \u0434\u043b\u044f React<\/a>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 happy coding!<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p><a href=\"https:\/\/timeweb.cloud\/?utm_source=habr&amp;utm_medium=banner&amp;utm_campaign=vds-promo-6-rub\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/p-\/u9\/l2\/p-u9l27ynelxi92bcmdxhu76ma8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/p-\/u9\/l2\/p-u9l27ynelxi92bcmdxhu76ma8.png\"\/><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><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\/company\/timeweb\/blog\/707744\/\"> https:\/\/habr.com\/ru\/company\/timeweb\/blog\/707744\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/bb\/gp\/sy\/bbgpsy6sug4wqfpa4b9pgwl1lmy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/bb\/gp\/sy\/bbgpsy6sug4wqfpa4b9pgwl1lmy.png\"\/>  <\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442, \u0434\u0440\u0443\u0437\u044c\u044f!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 <a href=\"https:\/\/profy.dev\/article\/react-typescript\">\u044d\u0442\u043e\u0439 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 React-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u0441\u0435\u0431\u044f: \u043d\u0430\u0434\u043e \u043b\u0438 \u043c\u043d\u0435 \u0443\u0447\u0438\u0442\u044c TypeScript? \u0415\u0449\u0435 \u043a\u0430\u043a \u043d\u0430\u0434\u043e!<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f TS \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u044b \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0432\u0430\u0448\u0438 \u0448\u0430\u043d\u0441\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043e\u043f\u043b\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0430\u0442\u0441\u044f;<\/li>\n<li>\u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0430\u0433\u043e\u0432, \u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0433\u0447\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c;<\/li>\n<li>\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u0434 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e TS \u0432 React.<\/p>\n<p>  <\/p>\n<p>\u0410\u043d\u0442\u0438\u0433\u0435\u0440\u043e\u0435\u043c \u043d\u0430\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u041f\u044d\u0442 \u2014 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440.<\/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-343149","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/343149","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=343149"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/343149\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=343149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=343149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=343149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}