{"id":373392,"date":"2024-05-21T05:35:03","date_gmt":"2024-05-21T05:35:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=373392"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=373392","title":{"rendered":"<span>RSLike@3. Well-known Symbol, \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Typescript, \u0438 \u0432\u0435\u0441\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div class=\"persona\"><img decoding=\"async\" class=\"image persona__image\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/990\/07a\/3ba\/99007a3ba964c3e4dfa146a7a25443a2.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/990\/07a\/3ba\/99007a3ba964c3e4dfa146a7a25443a2.jpg\" data-blurred=\"true\"\/><\/p>\n<h5 class=\"persona__heading\">Vitali Haradkou<\/h5>\n<p>Senior SDET. Certified Node.js Application Developer (JSNAD). TG: @haradkou_sdet<\/p>\n<\/div>\n<p>\u0415\u0449\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0438\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 <code>null<\/code> \u0438 <code>undefined<\/code> . \u0427\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0443 Rust <a href=\"https:\/\/doc.rust-lang.org\/std\/option\/\" rel=\"noopener noreferrer nofollow\">Option<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/result\/index.html\" rel=\"noopener noreferrer nofollow\">Result<\/a> \u0430\u043f\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0432\u0438\u0434\u0435\u043b \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0433\u043e \u0447\u0443\u0434\u0430, \u0442\u043e \u043f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f Rust \u0443\u0432\u0438\u0434\u0435\u043b \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0435\u0440\u0442\u043e\u043a. \u0418 \u043f\u043e\u0441\u043b\u0435 <s>\u0440\u0435\u0441\u0435\u0440\u0447\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/s> \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u0442\u0430\u043a\u043e\u0435 \u0447\u0443\u0434\u043e \u0441\u0430\u043c \u0434\u043b\u044f javascript \u0438 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435). \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/1.0.0\" rel=\"noopener noreferrer nofollow\">1<\/a>, \u0430 \u0437\u0430 \u043d\u0435\u0439 \u0435\u0449\u0435 <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fstd%401.6.0\" rel=\"noopener noreferrer nofollow\">\u043a\u0443\u0447\u0430 \u0444\u0438\u043a\u0441\u043e\u0432<\/a>, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fstd%402.0.0\" rel=\"noopener noreferrer nofollow\">2<\/a>, \u0433\u0434\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f cmp \u043f\u0430\u043a\u0435\u0442 \u0438 dbg. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e (10 \u0430\u043f\u0440\u0435\u043b\u044f 2024) \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0441\u0432\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044f 3 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fstd%403.0.0\" rel=\"noopener noreferrer nofollow\">std<\/a>, <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fcmp%403.0.0\" rel=\"noopener noreferrer nofollow\">cmp<\/a>, <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fdbg%403.0.0\" rel=\"noopener noreferrer nofollow\">dbg<\/a>. <\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 rslike<\/h2>\n<p><a href=\"https:\/\/github.com\/vitalics\/rslike\" rel=\"noopener noreferrer nofollow\">Rslike<\/a> &#8212; \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c null, undefined, \u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 2 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 &#8212; <code>Option<\/code> \u0438 <code>Result<\/code>.<\/p>\n<p><code>Option&lt;T><\/code> &#8212; \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>null<\/code> \u0438(\u043b\u0438) <code>undefined<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>Some<\/code>  \u0438 <code>None<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0437\u0436\u0435, \u0433\u0434\u0435 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>unwrap<\/code> \u0438  <code>expect<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>isSome<\/code>, <code>isNone<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043d\u0435 \u043a\u0430\u043a <code>Option<\/code> \u0430 \u043a\u0430\u043a <code>Some<\/code>, \u043b\u0438\u0431\u043e <code>None<\/code> <\/p>\n<pre><code class=\"typescript\">Some() \/\/ None&lt;undefined> Some(3) \/\/ Some&lt;3> Some&lt;number>(3) \/\/ Some&lt;number> Some(undefined) \/\/! None&lt;undefined> Some&lt;number>(undefined) \/\/! None&lt;number>  None() \/\/ None&lt;undefined> None(null) \/\/ None&lt;null> None(3) \/\/ None&lt;number><\/code><\/pre>\n<p><code>Result&lt;T,E><\/code> &#8212; \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 &#171;\u0443\u043f\u0430\u0441\u0442\u044c&#187;. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 &#8212; \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 <code>Bind<\/code> \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#171;\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439&#187; \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f <code>Result&lt;Option&lt;T>, E><\/code>. \u0413\u0434\u0435 <code>T<\/code> \u0438 <code>E<\/code> &#8212; generics \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<pre><code class=\"typescript\">Ok(3) \/\/ Result&lt;3, unknown> Ok&lt;number>(3) \/\/ Result&lt;number, unknown> Ok(undefined) \/\/ Result&lt;undefined, unknown>  Err(undefined) \/\/ Result&lt;unkown, undefined> Err&lt;number>('hello world') \/\/ Result&lt;number, string> Err(new Error('hello world')) \/\/ Result&lt;unkown, Error><\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c <code>Bind<\/code> \u0438 <code>Async<\/code> \u043c\u043e\u0436\u043d\u043e \u0444\u0443\u043a\u043d\u0446\u0438\u0438 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c, \u0442.\u043a. \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 <code>Result&lt;Option&lt;T>, E><\/code><\/p>\n<pre><code class=\"typescript\">import { Bind, Async } from '@rslike\/std' function external(arg1: any, arg2: any): any {   \/\/ some implementation, can throws } external(1,2) \/\/ ok. e.g. returns 5 external(1,NaN) \/\/ throws Error  const binded = Bind(external) binded(1,2) \/\/ Ok(Some(5)) binded(1,NaN) \/\/ Err(Error)  const promiseOk = Promise.resolve(5) const safePromise1 = await Async(promiseOk) \/\/ Ok(Some(5))  safePromise1.isErr() \/\/ false safePromise1.isOk() \/\/ true  const promiseErr = Promise.reject('I fails unexpected') const safePromise2 = await Async(promiseErr) \/\/ Err('I fails unexpected')  safePromise2.isErr() \/\/ true safePromise2.isOk() \/\/ false<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e.<\/p>\n<h2>Std. Well-known Symbols<\/h2>\n<p>\u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol#well-known_symbols\" rel=\"noopener noreferrer nofollow\">Well-known Symbols<\/a>.<\/p>\n<p>\u0421\u044e\u0434\u0430 \u0432\u0445\u043e\u0434\u044f\u0442 \u0442\u0430\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043a\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>Symbol.iterator<\/p>\n<\/li>\n<li>\n<p>Symbol.asyncIterator<\/p>\n<\/li>\n<li>\n<p>Symbol.search<\/p>\n<\/li>\n<li>\n<p>Symbol.split<\/p>\n<\/li>\n<li>\n<p>Symbol.toPrimitive<\/p>\n<\/li>\n<li>\n<p>Symbol.toStringTag<\/p>\n<\/li>\n<li>\n<p>Symbol.inspect(\u0434\u0430, \u0437\u043d\u0430\u044e \u0447\u0442\u043e \u043e\u043d \u043d\u0435 well-known \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f <a href=\"https:\/\/nodejs.org\/api\/util.html#utilinspectcustom\" rel=\"noopener noreferrer nofollow\">inspect<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 node.js. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442)<\/p>\n<\/li>\n<\/ul>\n<p>C\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 <code>for...of<\/code> <\/p>\n<p>\u0414\u043e 3 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u0435\u043b\u0430\u0442\u044c <code>unwrap<\/code> <\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std'  const a = Some([1,2,3])  for(let el of a.unwrap()){   \/\/ el: 1,2,3 }<\/code><\/pre>\n<p>\u0421 \u0432\u0435\u0440\u0441\u0438\u0438 3 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f unwrap. \u041c\u0435\u043b\u043e\u0447\u044c, \u0430 \u043f\u0440\u0438\u044f\u0442\u043d\u043e ?.<\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std' const a = Some([1,2,3])  for(let el of a){   \/\/ el: 1,2,3 }<\/code><\/pre>\n<p>\u0411\u043e\u043d\u0443\u0441 &#8212; TS Type inferring. \u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>Option<\/code> \u0438\u043b\u0438 <code>Result<\/code> \u043d\u0435 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0438\u043f &#8212; \u0431\u0443\u0434\u0435\u0442 <code>never<\/code>. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0432 runtime \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e <code>UndefinedBehaviorError<\/code> \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0447\u0438\u0441\u043b\u0430 \u043d\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Symbol.iterator<\/code> (\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f).<\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std'  const a = Some(3) for(let el of a) {   \/\/ el: never }<\/code><\/pre>\n<h2>STD. instanceof \u0434\u043b\u044f Some, None, Err, Ok<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <code>instanceof<\/code> \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol\/hasInstance\" rel=\"noopener noreferrer nofollow\">Symbol.hasInstance<\/a> \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Some, None, OK \u0438 Err.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 3<\/p>\n<pre><code class=\"typescript\">\/\/ v2 import { Ok, Result } from '@rslike\/std' const a = Ok(3) a instanceof Result \/\/ true a instanceof Ok \/\/ false<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 (\u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u0440\u0442 Result)<\/p>\n<pre><code class=\"typescript\">\/\/ v2 import { Ok, Err } from '@rslike\/std' const a = Ok(3) a instanceof Ok \/\/ true a instanceof Err \/\/ false<\/code><\/pre>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430.<\/p>\n<h2>STD. TS types<\/h2>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c &#8212; typescript \u0438 \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u0432 <code>Some<\/code>, <code>None<\/code> , <code>Ok<\/code>, <code>Err<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e generic \u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 generic. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0438. \u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f(\u0438\u043b\u0438 \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0438\u0439) \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u0440\u0435\u0436\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std'  let a: number = 5 const a = Some(a) \/\/ Some&lt;number>  a.isSome() \/\/ boolean  let b: number = 5 const c = Some(b) \/\/ Some&lt;number>  a.isSome() \/\/ boolean<\/code><\/pre>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043c\u0443\u0442\u0430\u0446\u0438\u0435\u0439 \u0437\u0430\u043d\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u0442\u043e\u0434 <code>replace<\/code>  &#8212; \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435(\u0434\u0430, \u043e\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442). \u041d\u043e \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u0438 Typescript \u043f\u043e\u0432\u043e\u043b\u044f\u043b \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 &#8212; \u0437\u0430\u0433\u0430\u0434\u043a\u0430 ?. (\u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 &#8212; \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438\u043b\u0438 \u0432 \u043b\u0438\u0447\u043a\u0443, \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<h2>STD. match \u0438 double unwrap<\/h2>\n<p>\u0412 \u043f\u0430\u043a\u0435\u0442\u0435 std \u043f\u043e\u043c\u0438\u043c\u043e <code>Option<\/code> \u0438 <code>Result<\/code> \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <code>Bind<\/code>, <code>Async<\/code> \u0438 <code>match<\/code>. \u0415\u0441\u043b\u0438 <code>Bind<\/code> \u0438 <code>Async<\/code> \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>match<\/code> \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, &#8212; \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c unwrap \u0434\u043b\u044f <code>Result&lt;Option><\/code> \u0434\u0432\u0430\u0436\u0434\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>match<\/code> \u0440\u0430\u0437\u0430 \u0432 \u0434\u0432\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0434\u043e (67 \u0441\u0442\u0440\u043e\u043a)<\/p>\n<pre><code class=\"typescript\">import { Bind, match, Err, Ok } from '@rslike\/std'  function divide(a: number, b: number) {   if (b === 0) Err(\"Divide to zero\");   if (a === 0) Ok(0);   if (Number.isNaN(a) || Number.isNaN(b)) return Err(undefined);   return a \/ b; }  const binded = Bind(divide); const fn1 = binded(1, 1); \/\/ Result&lt;Option&lt;number | undefined>, string> const fn2 = binded(NaN, 1); \/\/ Result&lt;Option&lt;undefined>, string>  const res1 = match(   fn1, \/\/ or fn2   (res) => {     return match(       res,       (value) => {         console.log(\"value is:\", value);       },       () => {         console.log(\"value is None\");       }     );     },     (err) => {       console.error(err);     } );  console.log(res1); \/\/ value is: 1 console.log(res2); \/\/ value is None<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0442\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f match. \u041a\u043e\u0440\u043e\u0447\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 <code>isOk<\/code> \u0438 <code>isSome<\/code> \u0438 \u043a\u043e\u0434 \u0431\u044b\u043b \u0431\u044b \u043a\u043e\u0440\u043e\u0447\u0435.<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 3 (27 \u0441\u0442\u0440\u043e\u043a)<\/p>\n<pre><code class=\"typescript\">import { Bind, match, Err, Ok } from '@rslike\/std'  function divide(a: number, b: number) {   if (b === 0) Err(\"Divide to zero\");   if (a === 0) Ok(0);   if (Number.isNaN(a) || Number.isNaN(b)) return Err(undefined);   return a \/ b; }  const binded = Bind(divide); const fn1 = binded(1, 1); \/\/ Result&lt;Option&lt;number | undefined>, string> const fn2 = binded(NaN, 1); \/\/ Result&lt;Option&lt;undefined>, string>  const res1 = match(   fn1, \/\/ or fn2   (value) => {     console.log(\"value is:\", value);   },   (err) => {     if (err) console.error(err);     else console.log(\"value is None\");   } );  res1 \/\/ value is: 1 \/\/ or res2 - value is None<\/code><\/pre>\n<h2>Cmp<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f(cmp \u0438\u043b\u0438 comparison package) \u0431\u044b\u043b\u043e   \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f <code>Eq<\/code>, <code>PartialEq<\/code>, <code>Ord<\/code> \u043c\u0435\u0442\u043e\u0434\u044b equals, partialEquals, compare. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Symbol.equals<\/code>, <code>Symbol.partialEquals<\/code> \u0438 <code>Symbol.compare<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<pre><code class=\"typescript\">import { type Eq, equals } from '@rslike\/cmp'  class Author implements Eq {   constructor(readonly name: string){}      [Symbol.equals](another: unknown){     return another instanceof Author &amp;&amp; this.name === another.name   } }  const pushkin = new Author('\u041f\u0443\u0448\u043a\u0438\u043d') const tolkien = new Author('\u0422\u043e\u043b\u043a\u0438\u0435\u043d')  pushin[Symbol.equals](tolkien) \/\/ false pushin[Symbol.equals](new Author('\u041f\u0443\u0448\u043a\u0438\u043d')) \/\/ true  \/\/ \u043b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e equals(pushkin, tolkien) \/\/ false equals(pushkin, new Author('\u041f\u0443\u0448\u043a\u0438\u043d')) \/\/ true<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0431\u043e\u043d\u0443\u0441, \u0434\u0430\u043d\u043d\u044b\u0435 well-known symbols \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Number<\/p>\n<\/li>\n<li>\n<p>String<\/p>\n<\/li>\n<li>\n<p>Boolean<\/p>\n<\/li>\n<li>\n<p>Date<\/p>\n<\/li>\n<\/ul>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/h2>\n<p>3 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0432\u043e\u044e \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b. \u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e &#8212; \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c CLI \u043d\u0430 node.js \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0444\u0430\u0438\u043b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043b\u0435\u0436\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c \u0438 \u043b\u0438\u0448\u0435\u043d \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043a\u0440\u043e\u043c\u0435 npm \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a). \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043d\u0435 \u0434\u0430\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u0443\u044e \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 <s>\u0441\u0442\u0438\u043b\u044f \u043a\u043e\u0434\u0430<\/s>. \u0422\u0430\u043a\u0436\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0443\u043c\u0435\u0449\u0430\u043b\u0441\u044f \u0432 1 \u0444\u0430\u0438\u043b, \u0438 \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c CLI \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442.\u0434. \u0421\u043a\u0430\u0437\u0430\u043d\u043e &#8212; \u0441\u0434\u0435\u043b\u0430\u043d\u043e.<\/p>\n<p>\u0421\u0430\u043c \u0444\u0430\u0438\u043b \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 500 \u0441\u0442\u0440\u043e\u043a \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0425\u0435\u043b\u043f\u0435\u0440\u044b(\u0442\u0438\u043f\u0430 \u0438\u0441\u0442\u0430\u043d\u0441\u0430 axios, \u043f\u0443\u0442\u0435\u0439, \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a) \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 ~250 \u0441\u0442\u0440\u043e\u043a \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0418\u0442\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0438 ~250 \u0441\u0442\u0440\u043e\u043a. \u041a\u043e\u043b-\u0432\u043e \u043a\u043e\u043c\u0430\u043d\u0434 &#8212; 5:<\/p>\n<ul>\n<li>\n<p>login<\/p>\n<\/li>\n<li>\n<p>logout<\/p>\n<\/li>\n<li>\n<p>ls &#8212; \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>get &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0430\u0438\u043b<\/p>\n<\/li>\n<li>\n<p>ctl &#8212; \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e \u0438 get \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0438\u043b &#8212; \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>program ctl 'npm run tests'<\/code> . \u0412 tests \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a env \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430\u044f \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0438\u043b \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f rslike \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b ~20% \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u044d\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 <code>null<\/code>, <code>undefined<\/code> , \u0438 <code>try catch finally<\/code> . \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043b\u0438 \u043c\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0447\u0438\u0442\u0430\u044e \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u0447\u043d\u043e\u0439.<\/p>\n<h2>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e \u0441\u0430\u043c \u0440\u0435\u043b\u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u0430 \u043a\u043e\u043b-\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2ae\/7ee\/755\/2ae7ee75560df9ea5d1a0a1189c71170.png\" alt=\"git info\" title=\"git info\" width=\"306\" height=\"68\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2ae\/7ee\/755\/2ae7ee75560df9ea5d1a0a1189c71170.png\"\/><\/p>\n<div><figcaption>git info<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u043c\u043e\u0433 \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u043d\u0434\u043b. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/bundlephobia.com\/package\/@rslike\/std@3.0.0\" rel=\"noopener noreferrer nofollow\">bundlephobia<\/a> \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c &#171;\u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u043e\u0441\u0442\u044c&#187;. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 2, \u043e\u0441\u043d\u043e\u0432\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 JSDoc \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0438\u0437-\u0437\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f TS \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/007\/62c\/2bb\/00762c2bbf85f376fb5516540de48f67.png\" alt=\"8.3kB v2 &amp; 12.6kB v3\" title=\"8.3kB v2 &amp; 12.6kB v3\" width=\"2184\" height=\"1312\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/007\/62c\/2bb\/00762c2bbf85f376fb5516540de48f67.png\"\/><\/p>\n<div><figcaption>8.3kB v2 &amp; 12.6kB v3<\/figcaption><\/div>\n<\/figure>\n<h2>\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b<\/h2>\n<p>\u041a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b &#8212; \u043c\u043e\u0438 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438.<\/p>\n<p>Telegram &#8212; <a href=\"https:\/\/t.me\/@vitalicset\" rel=\"noopener noreferrer nofollow\">@vitalicset<\/a><\/p>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u043a\u0443\u0434\u0430 \u0434\u0435\u043b\u0430\u044e \u043f\u043e\u0441\u0442\u044b \u043e \u0441\u0432\u044f\u043a\u043e\u043c, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, IT \u043d\u043e\u0432\u043e\u0441\u0442\u044f\u0445 \u0438 \u043e \u0442\u043e\u043c \u0447\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0443. \u042d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u0437\u044b\u0432! \u041d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0438\u044f\u0442\u043d\u043e &#8212; <a href=\"https:\/\/t.me\/@haradkou_sdet\" rel=\"noopener noreferrer nofollow\">@haradkou_sdet<\/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\/articles\/807089\/\"> https:\/\/habr.com\/ru\/articles\/807089\/<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div class=\"persona\">\n<h5 class=\"persona__heading\">Vitali Haradkou<\/h5>\n<p>Senior SDET. Certified Node.js Application Developer (JSNAD). TG: @haradkou_sdet<\/p>\n<\/div>\n<p>\u0415\u0449\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0438\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 <code>null<\/code> \u0438 <code>undefined<\/code> . \u0427\u0435\u0441\u0442\u043d\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0443 Rust <a href=\"https:\/\/doc.rust-lang.org\/std\/option\/\" rel=\"noopener noreferrer nofollow\">Option<\/a> \u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/result\/index.html\" rel=\"noopener noreferrer nofollow\">Result<\/a> \u0430\u043f\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u0432\u0438\u0434\u0435\u043b \u0432 \u044d\u0442\u043e\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0433\u043e \u0447\u0443\u0434\u0430, \u0442\u043e \u043f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f Rust \u0443\u0432\u0438\u0434\u0435\u043b \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0435\u0440\u0442\u043e\u043a. \u0418 \u043f\u043e\u0441\u043b\u0435 <s>\u0440\u0435\u0441\u0435\u0440\u0447\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/s> \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0443 \u0442\u0430\u043a\u043e\u0435 \u0447\u0443\u0434\u043e \u0441\u0430\u043c \u0434\u043b\u044f javascript \u0438 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435). \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/1.0.0\" rel=\"noopener noreferrer nofollow\">1<\/a>, \u0430 \u0437\u0430 \u043d\u0435\u0439 \u0435\u0449\u0435 <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fstd%401.6.0\" rel=\"noopener noreferrer nofollow\">\u043a\u0443\u0447\u0430 \u0444\u0438\u043a\u0441\u043e\u0432<\/a>, \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fstd%402.0.0\" rel=\"noopener noreferrer nofollow\">2<\/a>, \u0433\u0434\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f cmp \u043f\u0430\u043a\u0435\u0442 \u0438 dbg. \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e (10 \u0430\u043f\u0440\u0435\u043b\u044f 2024) \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u0441\u0432\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044f 3 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fstd%403.0.0\" rel=\"noopener noreferrer nofollow\">std<\/a>, <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fcmp%403.0.0\" rel=\"noopener noreferrer nofollow\">cmp<\/a>, <a href=\"https:\/\/github.com\/vitalics\/rslike\/releases\/tag\/%40rslike%2Fdbg%403.0.0\" rel=\"noopener noreferrer nofollow\">dbg<\/a>. <\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 rslike<\/h2>\n<p><a href=\"https:\/\/github.com\/vitalics\/rslike\" rel=\"noopener noreferrer nofollow\">Rslike<\/a> &#8212; \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c null, undefined, \u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 2 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 &#8212; <code>Option<\/code> \u0438 <code>Result<\/code>.<\/p>\n<p><code>Option&lt;T><\/code> &#8212; \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>null<\/code> \u0438(\u043b\u0438) <code>undefined<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <code>Some<\/code>  \u0438 <code>None<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0437\u0436\u0435, \u0433\u0434\u0435 \u044d\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>unwrap<\/code> \u0438  <code>expect<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043b\u0438\u0431\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>isSome<\/code>, <code>isNone<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u043d\u0435 \u043a\u0430\u043a <code>Option<\/code> \u0430 \u043a\u0430\u043a <code>Some<\/code>, \u043b\u0438\u0431\u043e <code>None<\/code> <\/p>\n<pre><code class=\"typescript\">Some() \/\/ None&lt;undefined> Some(3) \/\/ Some&lt;3> Some&lt;number>(3) \/\/ Some&lt;number> Some(undefined) \/\/! None&lt;undefined> Some&lt;number>(undefined) \/\/! None&lt;number>  None() \/\/ None&lt;undefined> None(null) \/\/ None&lt;null> None(3) \/\/ None&lt;number><\/code><\/pre>\n<p><code>Result&lt;T,E><\/code> &#8212; \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 &#171;\u0443\u043f\u0430\u0441\u0442\u044c&#187;. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043b\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u0435 &#8212; \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043b\u0438\u0431\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 <code>Bind<\/code> \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#171;\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439&#187; \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f <code>Result&lt;Option&lt;T>, E><\/code>. \u0413\u0434\u0435 <code>T<\/code> \u0438 <code>E<\/code> &#8212; generics \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438. <\/p>\n<pre><code class=\"typescript\">Ok(3) \/\/ Result&lt;3, unknown> Ok&lt;number>(3) \/\/ Result&lt;number, unknown> Ok(undefined) \/\/ Result&lt;undefined, unknown>  Err(undefined) \/\/ Result&lt;unkown, undefined> Err&lt;number>('hello world') \/\/ Result&lt;number, string> Err(new Error('hello world')) \/\/ Result&lt;unkown, Error><\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c <code>Bind<\/code> \u0438 <code>Async<\/code> \u043c\u043e\u0436\u043d\u043e \u0444\u0443\u043a\u043d\u0446\u0438\u0438 \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u043c, \u0442.\u043a. \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0432 <code>Result&lt;Option&lt;T>, E><\/code><\/p>\n<pre><code class=\"typescript\">import { Bind, Async } from '@rslike\/std' function external(arg1: any, arg2: any): any {   \/\/ some implementation, can throws } external(1,2) \/\/ ok. e.g. returns 5 external(1,NaN) \/\/ throws Error  const binded = Bind(external) binded(1,2) \/\/ Ok(Some(5)) binded(1,NaN) \/\/ Err(Error)  const promiseOk = Promise.resolve(5) const safePromise1 = await Async(promiseOk) \/\/ Ok(Some(5))  safePromise1.isErr() \/\/ false safePromise1.isOk() \/\/ true  const promiseErr = Promise.reject('I fails unexpected') const safePromise2 = await Async(promiseErr) \/\/ Err('I fails unexpected')  safePromise2.isErr() \/\/ true safePromise2.isOk() \/\/ false<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043e.<\/p>\n<h2>Std. Well-known Symbols<\/h2>\n<p>\u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0435 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol#well-known_symbols\" rel=\"noopener noreferrer nofollow\">Well-known Symbols<\/a>.<\/p>\n<p>\u0421\u044e\u0434\u0430 \u0432\u0445\u043e\u0434\u044f\u0442 \u0442\u0430\u043a\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043a\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>Symbol.iterator<\/p>\n<\/li>\n<li>\n<p>Symbol.asyncIterator<\/p>\n<\/li>\n<li>\n<p>Symbol.search<\/p>\n<\/li>\n<li>\n<p>Symbol.split<\/p>\n<\/li>\n<li>\n<p>Symbol.toPrimitive<\/p>\n<\/li>\n<li>\n<p>Symbol.toStringTag<\/p>\n<\/li>\n<li>\n<p>Symbol.inspect(\u0434\u0430, \u0437\u043d\u0430\u044e \u0447\u0442\u043e \u043e\u043d \u043d\u0435 well-known \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f <a href=\"https:\/\/nodejs.org\/api\/util.html#utilinspectcustom\" rel=\"noopener noreferrer nofollow\">inspect<\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 node.js. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442)<\/p>\n<\/li>\n<\/ul>\n<p>C\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f &#8212; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 <code>for...of<\/code> <\/p>\n<p>\u0414\u043e 3 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u0435\u043b\u0430\u0442\u044c <code>unwrap<\/code> <\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std'  const a = Some([1,2,3])  for(let el of a.unwrap()){   \/\/ el: 1,2,3 }<\/code><\/pre>\n<p>\u0421 \u0432\u0435\u0440\u0441\u0438\u0438 3 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f unwrap. \u041c\u0435\u043b\u043e\u0447\u044c, \u0430 \u043f\u0440\u0438\u044f\u0442\u043d\u043e ?.<\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std' const a = Some([1,2,3])  for(let el of a){   \/\/ el: 1,2,3 }<\/code><\/pre>\n<p>\u0411\u043e\u043d\u0443\u0441 &#8212; TS Type inferring. \u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>Option<\/code> \u0438\u043b\u0438 <code>Result<\/code> \u043d\u0435 \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0442\u0438\u043f &#8212; \u0431\u0443\u0434\u0435\u0442 <code>never<\/code>. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0432 runtime \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e <code>UndefinedBehaviorError<\/code> \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0447\u0438\u0441\u043b\u0430 \u043d\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Symbol.iterator<\/code> (\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f).<\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std'  const a = Some(3) for(let el of a) {   \/\/ el: never }<\/code><\/pre>\n<h2>STD. instanceof \u0434\u043b\u044f Some, None, Err, Ok<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <code>instanceof<\/code> \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Symbol\/hasInstance\" rel=\"noopener noreferrer nofollow\">Symbol.hasInstance<\/a> \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 Some, None, OK \u0438 Err.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 3<\/p>\n<pre><code class=\"typescript\">\/\/ v2 import { Ok, Result } from '@rslike\/std' const a = Ok(3) a instanceof Result \/\/ true a instanceof Ok \/\/ false<\/code><\/pre>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 (\u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u0440\u0442 Result)<\/p>\n<pre><code class=\"typescript\">\/\/ v2 import { Ok, Err } from '@rslike\/std' const a = Ok(3) a instanceof Ok \/\/ true a instanceof Err \/\/ false<\/code><\/pre>\n<p>\u0414\u0430, \u044d\u0442\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430.<\/p>\n<h2>STD. TS types<\/h2>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u0447\u043d\u0430\u044f \u0433\u043e\u0440\u0434\u043e\u0441\u0442\u044c &#8212; typescript \u0438 \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u0432 <code>Some<\/code>, <code>None<\/code> , <code>Ok<\/code>, <code>Err<\/code> \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e generic \u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0439 generic. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0445\u0438\u0442\u0440\u043e\u0441\u0442\u0438. \u0410 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f(\u0438\u043b\u0438 \u043e\u043d \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0438\u0439) \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u043f\u0440\u0435\u0436\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<pre><code class=\"typescript\">import { Some } from '@rslike\/std'  let a: number = 5 const a = Some(a) \/\/ Some&lt;number>  a.isSome() \/\/ boolean  let b: number = 5 const c = Some(b) \/\/ Some&lt;number>  a.isSome() \/\/ boolean<\/code><\/pre>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0441 \u043c\u0443\u0442\u0430\u0446\u0438\u0435\u0439 \u0437\u0430\u043d\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u0435\u0442\u043e\u0434 <code>replace<\/code>  &#8212; \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435(\u0434\u0430, \u043e\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0443\u0442\u0438\u0440\u0443\u0435\u0442). \u041d\u043e \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u0438 Typescript \u043f\u043e\u0432\u043e\u043b\u044f\u043b \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 &#8212; \u0437\u0430\u0433\u0430\u0434\u043a\u0430 ?. (\u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0435\u0442\u0435 &#8212; \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438\u043b\u0438 \u0432 \u043b\u0438\u0447\u043a\u0443, \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<h2>STD. match \u0438 double unwrap<\/h2>\n<p>\u0412 \u043f\u0430\u043a\u0435\u0442\u0435 std \u043f\u043e\u043c\u0438\u043c\u043e <code>Option<\/code> \u0438 <code>Result<\/code> \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <code>Bind<\/code>, <code>Async<\/code> \u0438 <code>match<\/code>. \u0415\u0441\u043b\u0438 <code>Bind<\/code> \u0438 <code>Async<\/code> \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>match<\/code> \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, &#8212; \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c unwrap \u0434\u043b\u044f <code>Result&lt;Option><\/code> \u0434\u0432\u0430\u0436\u0434\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u0434 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>match<\/code> \u0440\u0430\u0437\u0430 \u0432 \u0434\u0432\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0434\u043e (67 \u0441\u0442\u0440\u043e\u043a)<\/p>\n<pre><code class=\"typescript\">import { Bind, match, Err, Ok } from '@rslike\/std'  function divide(a: number, b: number) {   if (b === 0) Err(\"Divide to zero\");   if (a === 0) Ok(0);   if (Number.isNaN(a) || Number.isNaN(b)) return Err(undefined);   return a \/ b; }  const binded = Bind(divide); const fn1 = binded(1, 1); \/\/ Result&lt;Option&lt;number | undefined>, string> const fn2 = binded(NaN, 1); \/\/ Result&lt;Option&lt;undefined>, string>  const res1 = match(   fn1, \/\/ or fn2   (res) => {     return match(       res,       (value) => {         console.log(\"value is:\", value);       },       () => {         console.log(\"value is None\");       }     );     },     (err) => {       console.error(err);     } );  console.log(res1); \/\/ value is: 1 console.log(res2); \/\/ value is None<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0442\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f match. \u041a\u043e\u0440\u043e\u0447\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 <code>isOk<\/code> \u0438 <code>isSome<\/code> \u0438 \u043a\u043e\u0434 \u0431\u044b\u043b \u0431\u044b \u043a\u043e\u0440\u043e\u0447\u0435.<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 3 (27 \u0441\u0442\u0440\u043e\u043a)<\/p>\n<pre><code class=\"typescript\">import { Bind, match, Err, Ok } from '@rslike\/std'  function divide(a: number, b: number) {   if (b === 0) Err(\"Divide to zero\");   if (a === 0) Ok(0);   if (Number.isNaN(a) || Number.isNaN(b)) return Err(undefined);   return a \/ b; }  const binded = Bind(divide); const fn1 = binded(1, 1); \/\/ Result&lt;Option&lt;number | undefined>, string> const fn2 = binded(NaN, 1); \/\/ Result&lt;Option&lt;undefined>, string>  const res1 = match(   fn1, \/\/ or fn2   (value) => {     console.log(\"value is:\", value);   },   (err) => {     if (err) console.error(err);     else console.log(\"value is None\");   } );  res1 \/\/ value is: 1 \/\/ or res2 - value is None<\/code><\/pre>\n<h2>Cmp<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f(cmp \u0438\u043b\u0438 comparison package) \u0431\u044b\u043b\u043e   \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0434\u043b\u044f <code>Eq<\/code>, <code>PartialEq<\/code>, <code>Ord<\/code> \u043c\u0435\u0442\u043e\u0434\u044b equals, partialEquals, compare. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>Symbol.equals<\/code>, <code>Symbol.partialEquals<\/code> \u0438 <code>Symbol.compare<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<pre><code class=\"typescript\">import { type Eq, equals } from '@rslike\/cmp'  class Author implements Eq {   constructor(readonly name: string){}      [Symbol.equals](another: unknown){     return another instanceof Author &amp;&amp; this.name === another.name   } }  const pushkin = new Author('\u041f\u0443\u0448\u043a\u0438\u043d') const tolkien = new Author('\u0422\u043e\u043b\u043a\u0438\u0435\u043d')  pushin[Symbol.equals](tolkien) \/\/ false pushin[Symbol.equals](new Author('\u041f\u0443\u0448\u043a\u0438\u043d')) \/\/ true  \/\/ \u043b\u0438\u0431\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0440\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e equals(pushkin, tolkien) \/\/ false equals(pushkin, new Author('\u041f\u0443\u0448\u043a\u0438\u043d')) \/\/ true<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0431\u043e\u043d\u0443\u0441, \u0434\u0430\u043d\u043d\u044b\u0435 well-known symbols \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Number<\/p>\n<\/li>\n<li>\n<p>String<\/p>\n<\/li>\n<li>\n<p>Boolean<\/p>\n<\/li>\n<li>\n<p>Date<\/p>\n<\/li>\n<\/ul>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/h2>\n<p>3 \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0432\u043e\u044e \u0436\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b. \u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e &#8212; \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c CLI \u043d\u0430 node.js \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440, \u0437\u0430\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u0444\u0430\u0438\u043b. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043b\u0435\u0436\u0438\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0438 \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u043c \u0438 \u043b\u0438\u0448\u0435\u043d \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u043a\u0440\u043e\u043c\u0435 npm \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a). \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043d\u0435 \u0434\u0430\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u0443\u044e \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 <s>\u0441\u0442\u0438\u043b\u044f \u043a\u043e\u0434\u0430<\/s>. \u0422\u0430\u043a\u0436\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0443\u043c\u0435\u0449\u0430\u043b\u0441\u044f \u0432 1 \u0444\u0430\u0438\u043b, \u0438 \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c CLI \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0442.\u0434. \u0421\u043a\u0430\u0437\u0430\u043d\u043e &#8212; \u0441\u0434\u0435\u043b\u0430\u043d\u043e.<\/p>\n<p>\u0421\u0430\u043c \u0444\u0430\u0438\u043b \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 500 \u0441\u0442\u0440\u043e\u043a \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0425\u0435\u043b\u043f\u0435\u0440\u044b(\u0442\u0438\u043f\u0430 \u0438\u0441\u0442\u0430\u043d\u0441\u0430 axios, \u043f\u0443\u0442\u0435\u0439, \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a) \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 ~250 \u0441\u0442\u0440\u043e\u043a \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0418\u0442\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0438 ~250 \u0441\u0442\u0440\u043e\u043a. \u041a\u043e\u043b-\u0432\u043e \u043a\u043e\u043c\u0430\u043d\u0434 &#8212; 5:<\/p>\n<ul>\n<li>\n<p>login<\/p>\n<\/li>\n<li>\n<p>logout<\/p>\n<\/li>\n<li>\n<p>ls &#8212; \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0432\u0441\u0435 \u043f\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/p>\n<\/li>\n<li>\n<p>get &#8212; \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0430\u0438\u043b<\/p>\n<\/li>\n<li>\n<p>ctl &#8212; \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e \u0438 get \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0444\u0430\u0438\u043b &#8212; \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>program ctl 'npm run tests'<\/code> . \u0412 tests \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a env \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430\u044f \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0438\u043b \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f rslike \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b ~20% \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u044d\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 <code>null<\/code>, <code>undefined<\/code> , \u0438 <code>try catch finally<\/code> . \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043b\u0438 \u043c\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0447\u0438\u0442\u0430\u044e \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u0430\u0447\u043d\u043e\u0439.<\/p>\n<h2>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e \u0441\u0430\u043c \u0440\u0435\u043b\u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u0430 \u043a\u043e\u043b-\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"\">\n<div><figcaption>git info<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u043c\u043e\u0433 \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0430\u043d\u0434\u043b. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 <a href=\"https:\/\/bundlephobia.com\/package\/@rslike\/std@3.0.0\" rel=\"noopener noreferrer nofollow\">bundlephobia<\/a> \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-373392","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/373392","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=373392"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/373392\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=373392"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=373392"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=373392"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}