{"id":1413,"date":"2024-06-02T23:00:25","date_gmt":"2024-06-02T23:00:25","guid":{"rendered":""},"modified":"2024-06-05T06:12:46","modified_gmt":"2024-06-04T22:12:46","slug":"typescript-%e4%b9%8b-more-on-functions","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1413","title":{"rendered":"TypeScript \u4e4b More on Functions"},"content":{"rendered":"<td class=\"d-block comment-body markdown-body  js-comment-body\">\n<h2 dir=\"auto\">\u524d\u8a00<\/h2>\n<p dir=\"auto\">TypeScript \u7684\u5b98\u65b9\u6587\u6863\u65e9\u5df2\u66f4\u65b0\uff0c\u4f46\u6211\u80fd\u627e\u5230\u7684\u4e2d\u6587\u6587\u6863\u90fd\u8fd8\u505c\u7559\u5728\u6bd4\u8f83\u8001\u7684\u7248\u672c\u3002\u6240\u4ee5\u5bf9\u5176\u4e2d\u65b0\u589e\u4ee5\u53ca\u4fee\u8ba2\u8f83\u591a\u7684\u4e00\u4e9b\u7ae0\u8282\u8fdb\u884c\u4e86\u7ffb\u8bd1\u6574\u7406\u3002<\/p>\n<p dir=\"auto\">\u672c\u7bc7\u6574\u7406\u81ea TypeScript Handbook \u4e2d \u300c<a href=\"https:\/\/www.typescriptlang.org\/docs\/handbook\/2\/functions.html\" rel=\"nofollow\">More on Functions<\/a>\u300d \u7ae0\u8282\u3002<\/p>\n<p dir=\"auto\">\u672c\u6587\u5e76\u4e0d\u4e25\u683c\u6309\u7167\u539f\u6587\u7ffb\u8bd1\uff0c\u5bf9\u90e8\u5206\u5185\u5bb9\u4e5f\u505a\u4e86\u89e3\u91ca\u8865\u5145\u3002<\/p>\n<h2 dir=\"auto\">\u6b63\u6587<\/h2>\n<p dir=\"auto\">\u51fd\u6570\u662f\u4efb\u4f55\u5e94\u7528\u7684\u57fa\u7840\u7ec4\u6210\u90e8\u5206\uff0c\u65e0\u8bba\u5b83\u662f\u5c40\u90e8\u51fd\u6570\uff08local functions\uff09\uff0c\u8fd8\u662f\u4ece\u5176\u4ed6\u6a21\u5757\u5bfc\u5165\u7684\u51fd\u6570\uff0c\u4ea6\u6216\u662f\u7c7b\u4e2d\u7684\u65b9\u6cd5\u3002\u5f53\u7136\uff0c\u51fd\u6570\u4e5f\u662f\u503c (values)\uff0c\u800c\u4e14\u50cf\u5176\u4ed6\u503c\u4e00\u6837\uff0cTypeScript \u6709\u5f88\u591a\u79cd\u65b9\u5f0f\u7528\u6765\u63cf\u8ff0\uff0c\u51fd\u6570\u53ef\u4ee5\u4ee5\u600e\u6837\u7684\u65b9\u5f0f\u88ab\u8c03\u7528\u3002\u8ba9\u6211\u4eec\u6765\u5b66\u4e60\u4e00\u4e0b\u5982\u4f55\u4e66\u5199\u63cf\u8ff0\u51fd\u6570\u7684\u7c7b\u578b\uff08types\uff09\u3002<\/p>\n<h2 dir=\"auto\">\u51fd\u6570\u7c7b\u578b\u8868\u8fbe\u5f0f\uff08Function Type Expressions\uff09<\/h2>\n<p dir=\"auto\">\u6700\u7b80\u5355\u63cf\u8ff0\u4e00\u4e2a\u51fd\u6570\u7684\u65b9\u5f0f\u662f\u4f7f\u7528**\u51fd\u6570\u7c7b\u578b\u8868\u8fbe\u5f0f\uff08function type expression\uff09\u3002**\u5b83\u7684\u5199\u6cd5\u6709\u70b9\u7c7b\u4f3c\u4e8e\u7bad\u5934\u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function greeter(fn: (a: string) =&gt; void) {\n  fn(\"Hello, World\");\n}\n \nfunction printToConsole(s: string) {\n  console.log(s);\n}\n \ngreeter(printToConsole);'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">greeter<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">fn<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Hello, World\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">printToConsole<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-en\">greeter<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">printToConsole<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8bed\u6cd5 <code class=\"notranslate\">(a: string) =&gt; void<\/code> \u8868\u793a\u4e00\u4e2a\u51fd\u6570\u6709\u4e00\u4e2a\u540d\u4e3a <code class=\"notranslate\">a<\/code> \uff0c\u7c7b\u578b\u662f\u5b57\u7b26\u4e32\u7684\u53c2\u6570\uff0c\u8fd9\u4e2a\u51fd\u6570\u5e76\u6ca1\u6709\u8fd4\u56de\u4efb\u4f55\u503c\u3002<\/p>\n<p dir=\"auto\">\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u53c2\u6570\u7684\u7c7b\u578b\u5e76\u6ca1\u6709\u660e\u786e\u7ed9\u51fa\uff0c\u5b83\u4f1a\u88ab\u9690\u5f0f\u8bbe\u7f6e\u4e3a <code class=\"notranslate\">any<\/code>\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">\u6ce8\u610f\u51fd\u6570\u53c2\u6570\u7684\u540d\u5b57\u662f\u5fc5\u987b\u7684\uff0c\u8fd9\u79cd\u51fd\u6570\u7c7b\u578b\u63cf\u8ff0 <code class=\"notranslate\">(string) =&gt; void<\/code>\uff0c\u8868\u793a\u7684\u5176\u5b9e\u662f\u4e00\u4e2a\u51fd\u6570\u6709\u4e00\u4e2a\u7c7b\u578b\u662f <code class=\"notranslate\">any<\/code>\uff0c\u540d\u4e3a <code class=\"notranslate\">string<\/code> \u7684\u53c2\u6570\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u5f53\u7136\u4e86\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u7c7b\u578b\u522b\u540d\uff08type alias\uff09\u5b9a\u4e49\u4e00\u4e2a\u51fd\u6570\u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type GreetFunction = (a: string) =&gt; void;\nfunction greeter(fn: GreetFunction) {\n  \/\/ ...\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">GreetFunction<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">greeter<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">fn<\/span>: <span class=\"pl-smi\">GreetFunction<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u8c03\u7528\u7b7e\u540d\uff08Call Signatures\uff09<\/h2>\n<p dir=\"auto\">\u5728 JavaScript \u4e2d\uff0c\u51fd\u6570\u9664\u4e86\u53ef\u4ee5\u88ab\u8c03\u7528\uff0c\u81ea\u5df1\u4e5f\u662f\u53ef\u4ee5\u6709\u5c5e\u6027\u503c\u7684\u3002\u7136\u800c\u4e0a\u4e00\u8282\u8bb2\u5230\u7684\u51fd\u6570\u7c7b\u578b\u8868\u8fbe\u5f0f\u5e76\u4e0d\u80fd\u652f\u6301\u58f0\u660e\u5c5e\u6027\uff0c\u5982\u679c\u6211\u4eec\u60f3\u63cf\u8ff0\u4e00\u4e2a\u5e26\u6709\u5c5e\u6027\u7684\u51fd\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u5728\u4e00\u4e2a\u5bf9\u8c61\u7c7b\u578b\u4e2d\u5199\u4e00\u4e2a\u8c03\u7528\u7b7e\u540d\uff08call signature\uff09\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='type DescribableFunction = {\n  description: string;\n  (someArg: number): boolean;\n};\nfunction doSomething(fn: DescribableFunction) {\n  console.log(fn.description + \" returned \" + fn(6));\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">DescribableFunction<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">description<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">someArg<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">doSomething<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">fn<\/span>: <span class=\"pl-smi\">DescribableFunction<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">description<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s\">\" returned \"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">6<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6ce8\u610f\u8fd9\u4e2a\u8bed\u6cd5\u8ddf\u51fd\u6570\u7c7b\u578b\u8868\u8fbe\u5f0f\u7a0d\u6709\u4e0d\u540c\uff0c\u5728\u53c2\u6570\u5217\u8868\u548c\u8fd4\u56de\u7684\u7c7b\u578b\u4e4b\u95f4\u7528\u7684\u662f <code class=\"notranslate\">:<\/code> \u800c\u4e0d\u662f <code class=\"notranslate\">=&gt;<\/code>\u3002<\/p>\n<h2 dir=\"auto\">\u6784\u9020\u7b7e\u540d \uff08Construct Signatures\uff09<\/h2>\n<p dir=\"auto\">JavaScript \u51fd\u6570\u4e5f\u53ef\u4ee5\u4f7f\u7528 <code class=\"notranslate\">new<\/code> \u64cd\u4f5c\u7b26\u8c03\u7528\uff0c\u5f53\u88ab\u8c03\u7528\u7684\u65f6\u5019\uff0cTypeScript \u4f1a\u8ba4\u4e3a\u8fd9\u662f\u4e00\u4e2a\u6784\u9020\u51fd\u6570(constructors)\uff0c\u56e0\u4e3a\u4ed6\u4eec\u4f1a\u4ea7\u751f\u4e00\u4e2a\u65b0\u5bf9\u8c61\u3002\u4f60\u53ef\u4ee5\u5199\u4e00\u4e2a\u6784\u9020\u7b7e\u540d\uff0c\u65b9\u6cd5\u662f\u5728\u8c03\u7528\u7b7e\u540d\u524d\u9762\u52a0\u4e00\u4e2a <code class=\"notranslate\">new<\/code> \u5173\u952e\u8bcd\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='type SomeConstructor = {\n  new (s: string): SomeObject;\n};\nfunction fn(ctor: SomeConstructor) {\n  return new ctor(\"hello\");\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">SomeConstructor<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">new<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">SomeObject<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">ctor<\/span>: <span class=\"pl-smi\">SomeConstructor<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-s1\">ctor<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e00\u4e9b\u5bf9\u8c61\uff0c\u6bd4\u5982 <code class=\"notranslate\">Date<\/code> \u5bf9\u8c61\uff0c\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528 <code class=\"notranslate\">new<\/code> \u64cd\u4f5c\u7b26\u8c03\u7528\uff0c\u800c\u4f60\u53ef\u4ee5\u5c06\u8c03\u7528\u7b7e\u540d\u548c\u6784\u9020\u7b7e\u540d\u5408\u5e76\u5728\u4e00\u8d77\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface CallOrConstruct {\n  new (s: string): Date;\n  (n?: number): number;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">CallOrConstruct<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">new<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Date<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u6cdb\u578b\u51fd\u6570 \uff08Generic Functions\uff09<\/h2>\n<p dir=\"auto\">\u6211\u4eec\u7ecf\u5e38\u9700\u8981\u5199\u8fd9\u79cd\u51fd\u6570\uff0c\u5373\u51fd\u6570\u7684\u8f93\u51fa\u7c7b\u578b\u4f9d\u8d56\u51fd\u6570\u7684\u8f93\u5165\u7c7b\u578b\uff0c\u6216\u8005\u4e24\u4e2a\u8f93\u5165\u7684\u7c7b\u578b\u4ee5\u67d0\u79cd\u5f62\u5f0f\u76f8\u4e92\u5173\u8054\u3002\u8ba9\u6211\u4eec\u8003\u8651\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\uff0c\u5b83\u8fd4\u56de\u6570\u7ec4\u7684\u7b2c\u4e00\u4e2a\u5143\u7d20\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function firstElement(arr: any[]) {\n  return arr[0];\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">firstElement<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6ce8\u610f\u6b64\u65f6\u51fd\u6570\u8fd4\u56de\u503c\u7684\u7c7b\u578b\u662f <code class=\"notranslate\">any<\/code>\uff0c\u5982\u679c\u80fd\u8fd4\u56de\u7b2c\u4e00\u4e2a\u5143\u7d20\u7684\u5177\u4f53\u7c7b\u578b\u5c31\u66f4\u597d\u4e86\u3002<\/p>\n<p dir=\"auto\">\u5728 TypeScript \u4e2d\uff0c\u6cdb\u578b\u5c31\u662f\u88ab\u7528\u6765\u63cf\u8ff0\u4e24\u4e2a\u503c\u4e4b\u95f4\u7684\u5bf9\u5e94\u5173\u7cfb\u3002\u6211\u4eec\u9700\u8981\u5728\u51fd\u6570\u7b7e\u540d\u91cc\u58f0\u660e\u4e00\u4e2a<strong>\u7c7b\u578b\u53c2\u6570 (type parameter)<\/strong>\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function firstElement&lt;Type&gt;(arr: Type[]): Type | undefined {\n  return arr[0];\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">firstElement<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Type<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-c1\">undefined<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u901a\u8fc7\u7ed9\u51fd\u6570\u6dfb\u52a0\u4e00\u4e2a\u7c7b\u578b\u53c2\u6570 <code class=\"notranslate\">Type<\/code>\uff0c\u5e76\u4e14\u5728\u4e24\u4e2a\u5730\u65b9\u4f7f\u7528\u5b83\uff0c\u6211\u4eec\u5c31\u5728\u51fd\u6570\u7684\u8f93\u5165(\u5373\u6570\u7ec4)\u548c\u51fd\u6570\u7684\u8f93\u51fa(\u5373\u8fd4\u56de\u503c)\u4e4b\u95f4\u521b\u5efa\u4e86\u4e00\u4e2a\u5173\u8054\u3002\u73b0\u5728\u5f53\u6211\u4eec\u8c03\u7528\u5b83\uff0c\u4e00\u4e2a\u66f4\u5177\u4f53\u7684\u7c7b\u578b\u5c31\u4f1a\u88ab\u5224\u65ad\u51fa\u6765\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ s is of type 'string'\nconst s = firstElement([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]);\n\/\/ n is of type 'number'\nconst n = firstElement([1, 2, 3]);\n\/\/ u is of type undefined\nconst u = firstElement([]);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ s is of type 'string'<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">s<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">firstElement<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"a\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"b\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"c\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ n is of type 'number'<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">n<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">firstElement<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ u is of type undefined<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">u<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">firstElement<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u63a8\u65ad\uff08Inference\uff09<\/h3>\n<p dir=\"auto\">\u6ce8\u610f\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u6ca1\u6709\u660e\u786e\u6307\u5b9a <code class=\"notranslate\">Type<\/code> \u7684\u7c7b\u578b\uff0c\u7c7b\u578b\u662f\u88ab TypeScript \u81ea\u52a8\u63a8\u65ad\u51fa\u6765\u7684\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528\u591a\u4e2a\u7c7b\u578b\u53c2\u6570\uff0c\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function map&lt;Input, Output&gt;(arr: Input[], func: (arg: Input) =&gt; Output): Output[] {\n  return arr.map(func);\n}\n \n\/\/ Parameter 'n' is of type 'string'\n\/\/ 'parsed' is of type 'number[]'\nconst parsed = map([&quot;1&quot;, &quot;2&quot;, &quot;3&quot;], (n) =&gt; parseInt(n));\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">map<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Input<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Output<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">Input<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">func<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span>: <span class=\"pl-smi\">Input<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">Output<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Output<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">map<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">func<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ Parameter 'n' is of type 'string'<\/span>\n<span class=\"pl-c\">\/\/ 'parsed' is of type 'number[]'<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">parsed<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">map<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"1\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"2\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"3\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-en\">parseInt<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6ce8\u610f\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0cTypeScript \u65e2\u53ef\u4ee5\u63a8\u65ad\u51fa Input \u7684\u7c7b\u578b \uff08\u4ece\u4f20\u5165\u7684 <code class=\"notranslate\">string<\/code> \u6570\u7ec4\uff09\uff0c\u53c8\u53ef\u4ee5\u6839\u636e\u51fd\u6570\u8868\u8fbe\u5f0f\u7684\u8fd4\u56de\u503c\u63a8\u65ad\u51fa <code class=\"notranslate\">Output<\/code> \u7684\u7c7b\u578b\u3002<\/p>\n<h3 dir=\"auto\">\u7ea6\u675f\uff08Constraints\uff09<\/h3>\n<p dir=\"auto\">\u6709\u7684\u65f6\u5019\uff0c\u6211\u4eec\u60f3\u5173\u8054\u4e24\u4e2a\u503c\uff0c\u4f46\u53ea\u80fd\u64cd\u4f5c\u503c\u7684\u4e00\u4e9b\u56fa\u5b9a\u5b57\u6bb5\uff0c\u8fd9\u79cd\u60c5\u51b5\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528**\u7ea6\u675f\uff08constraint\uff09**\u5bf9\u7c7b\u578b\u53c2\u6570\u8fdb\u884c\u9650\u5236\u3002<\/p>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u5199\u4e00\u4e2a\u51fd\u6570\uff0c\u51fd\u6570\u8fd4\u56de\u4e24\u4e2a\u503c\u4e2d\u66f4\u957f\u7684\u90a3\u4e2a\u3002\u4e3a\u6b64\uff0c\u6211\u4eec\u9700\u8981\u4fdd\u8bc1\u4f20\u5165\u7684\u503c\u6709\u4e00\u4e2a <code class=\"notranslate\">number<\/code> \u7c7b\u578b\u7684 <code class=\"notranslate\">length<\/code> \u5c5e\u6027\u3002\u6211\u4eec\u4f7f\u7528  <code class=\"notranslate\">extends<\/code>  \u8bed\u6cd5\u6765\u7ea6\u675f\u51fd\u6570\u53c2\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function longest&lt;Type extends { length: number }&gt;(a: Type, b: Type) {\n  if (a.length &gt;= b.length) {\n    return a;\n  } else {\n    return b;\n  }\n}\n \n\/\/ longerArray is of type 'number[]'\nconst longerArray = longest([1, 2], [1, 2, 3]);\n\/\/ longerString is of type 'alice' | 'bob'\nconst longerString = longest(&quot;alice&quot;, &quot;bob&quot;);\n\/\/ Error! Numbers don't have a 'length' property\nconst notOK = longest(10, 100);\n\/\/ Argument of type 'number' is not assignable to parameter of type '{ length: number; }'.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">longest<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">length<\/span>: <span class=\"pl-smi\">number<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">b<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-s1\">b<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">else<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">b<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ longerArray is of type 'number[]'<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">longerArray<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">longest<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ longerString is of type 'alice' | 'bob'<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">longerString<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">longest<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"alice\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"bob\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Error! Numbers don't have a 'length' property<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">notOK<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">longest<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">100<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Argument of type 'number' is not assignable to parameter of type '{ length: number; }'.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">TypeScript \u4f1a\u63a8\u65ad <code class=\"notranslate\">longest<\/code> \u7684\u8fd4\u56de\u7c7b\u578b\uff0c\u6240\u4ee5\u8fd4\u56de\u503c\u7684\u7c7b\u578b\u63a8\u65ad\u5728\u6cdb\u578b\u51fd\u6570\u91cc\u4e5f\u662f\u9002\u7528\u7684\u3002<\/p>\n<p dir=\"auto\">\u6b63\u662f\u56e0\u4e3a\u6211\u4eec\u5bf9 <code class=\"notranslate\">Type<\/code> \u505a\u4e86 <code class=\"notranslate\">{ length: number }<\/code> \u9650\u5236\uff0c\u6211\u4eec\u624d\u53ef\u4ee5\u88ab\u5141\u8bb8\u83b7\u53d6 <code class=\"notranslate\">a<\/code> <code class=\"notranslate\">b<\/code>\u53c2\u6570\u7684 <code class=\"notranslate\">.length<\/code> \u5c5e\u6027\u3002\u6ca1\u6709\u8fd9\u4e2a\u7c7b\u578b\u7ea6\u675f\uff0c\u6211\u4eec\u751a\u81f3\u4e0d\u80fd\u83b7\u53d6\u8fd9\u4e9b\u5c5e\u6027\uff0c\u56e0\u4e3a\u8fd9\u4e9b\u503c\u4e5f\u8bb8\u662f\u5176\u4ed6\u7c7b\u578b\uff0c\u5e76\u6ca1\u6709 length \u5c5e\u6027\u3002<\/p>\n<p dir=\"auto\">\u57fa\u4e8e\u4f20\u5165\u7684\u53c2\u6570\uff0c<code class=\"notranslate\">longerArray<\/code>\u548c <code class=\"notranslate\">longerString<\/code> \u4e2d\u7684\u7c7b\u578b\u90fd\u88ab\u63a8\u65ad\u51fa\u6765\u4e86\u3002\u8bb0\u4f4f\uff0c\u6240\u8c13\u6cdb\u578b\u5c31\u662f\u7528\u4e00\u4e2a\u76f8\u540c\u7c7b\u578b\u6765\u5173\u8054\u4e24\u4e2a\u6216\u8005\u66f4\u591a\u7684\u503c\u3002<\/p>\n<h3 dir=\"auto\">\u6cdb\u578b\u7ea6\u675f\u5b9e\u6218\uff08Working with Constrained Values\uff09<\/h3>\n<p dir=\"auto\">\u8fd9\u662f\u4e00\u4e2a\u4f7f\u7528\u6cdb\u578b\u7ea6\u675f\u5e38\u51fa\u73b0\u7684\u9519\u8bef\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function minimumLength&lt;Type extends { length: number }&gt;(\n  obj: Type,\n  minimum: number\n): Type {\n  if (obj.length &gt;= minimum) {\n    return obj;\n  } else {\n    return { length: minimum };\n    \/\/ Type '{ length: number; }' is not assignable to type 'Type'.\n    \/\/ '{ length: number; }' is assignable to the constraint of type 'Type', but 'Type' could be instantiated with a different subtype of constraint '{ length: number; }'.\n  }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">minimumLength<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">length<\/span>: <span class=\"pl-smi\">number<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span>\n  <span class=\"pl-s1\">obj<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-s1\">minimum<\/span>: <span class=\"pl-smi\">number<\/span>\n<span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Type<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span> <span class=\"pl-c1\">&gt;=<\/span> <span class=\"pl-s1\">minimum<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">else<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">length<\/span>: <span class=\"pl-s1\">minimum<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n    <span class=\"pl-c\">\/\/ Type '{ length: number; }' is not assignable to type 'Type'.<\/span>\n    <span class=\"pl-c\">\/\/ '{ length: number; }' is assignable to the constraint of type 'Type', but 'Type' could be instantiated with a different subtype of constraint '{ length: number; }'.<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u4e2a\u51fd\u6570\u770b\u8d77\u6765\u50cf\u662f\u6ca1\u6709\u95ee\u9898\uff0c<code class=\"notranslate\">Type<\/code> \u88ab <code class=\"notranslate\">{ length: number}<\/code> \u7ea6\u675f\uff0c\u51fd\u6570\u8fd4\u56de <code class=\"notranslate\">Type<\/code> \u6216\u8005\u4e00\u4e2a\u7b26\u5408\u7ea6\u675f\u7684\u503c\u3002<\/p>\n<p dir=\"auto\">\u800c\u8fd9\u5176\u4e2d\u7684\u95ee\u9898\u5c31\u5728\u4e8e\u51fd\u6570\u7406\u5e94\u8fd4\u56de\u4e0e\u4f20\u5165\u53c2\u6570\u76f8\u540c\u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7b26\u5408\u7ea6\u675f\u7684\u5bf9\u8c61\u3002\u6211\u4eec\u53ef\u4ee5\u5199\u51fa\u8fd9\u6837\u4e00\u6bb5\u53cd\u4f8b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ 'arr' gets value { length: 6 }\nconst arr = minimumLength([1, 2, 3], 6);\n\/\/ and crashes here because arrays have\n\/\/ a 'slice' method, but not the returned object!\nconsole.log(arr.slice(0));\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ 'arr' gets value { length: 6 }<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">arr<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">minimumLength<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">6<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ and crashes here because arrays have<\/span>\n<span class=\"pl-c\">\/\/ a 'slice' method, but not the returned object!<\/span>\n<span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">slice<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u58f0\u660e\u7c7b\u578b\u53c2\u6570 \uff08Specifying Type Arguments\uff09<\/h3>\n<p dir=\"auto\">TypeScript \u901a\u5e38\u80fd\u81ea\u52a8\u63a8\u65ad\u6cdb\u578b\u8c03\u7528\u4e2d\u4f20\u5165\u7684\u7c7b\u578b\u53c2\u6570\uff0c\u4f46\u4e5f\u5e76\u4e0d\u80fd\u603b\u662f\u63a8\u65ad\u51fa\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u6709\u8fd9\u6837\u4e00\u4e2a\u5408\u5e76\u4e24\u4e2a\u6570\u7ec4\u7684\u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function combine&lt;Type&gt;(arr1: Type[], arr2: Type[]): Type[] {\n  return arr1.concat(arr2);\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">combine<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr1<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">arr2<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr1<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">concat<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr2<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5982\u679c\u4f60\u50cf\u4e0b\u9762\u8fd9\u6837\u8c03\u7528\u51fd\u6570\u5c31\u4f1a\u51fa\u73b0\u9519\u8bef\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const arr = combine([1, 2, 3], [&quot;hello&quot;]);\n\/\/ Type 'string' is not assignable to type 'number'.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">arr<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">combine<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Type 'string' is not assignable to type 'number'.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u800c\u5982\u679c\u4f60\u6267\u610f\u8981\u8fd9\u6837\u505a\uff0c\u4f60\u53ef\u4ee5\u624b\u52a8\u6307\u5b9a <code class=\"notranslate\">Type<\/code>\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='const arr = combine&lt;string | number&gt;([1, 2, 3], [\"hello\"]);'>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">arr<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">combine<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u5199\u4e00\u4e2a\u597d\u7684\u6cdb\u578b\u51fd\u6570\u7684\u4e00\u4e9b\u5efa\u8bae<\/h3>\n<p dir=\"auto\">\u5c3d\u7ba1\u5199\u6cdb\u578b\u51fd\u6570\u5f88\u6709\u610f\u601d\uff0c\u4f46\u4e5f\u5bb9\u6613\u7ffb\u8f66\u3002\u5982\u679c\u4f60\u4f7f\u7528\u4e86\u592a\u591a\u7684\u7c7b\u578b\u53c2\u6570\uff0c\u6216\u8005\u4f7f\u7528\u4e86\u4e00\u4e9b\u5e76\u4e0d\u9700\u8981\u7684\u7ea6\u675f\uff0c\u90fd\u53ef\u80fd\u4f1a\u5bfc\u81f4\u4e0d\u6b63\u786e\u7684\u7c7b\u578b\u63a8\u65ad\u3002<\/p>\n<h4 dir=\"auto\">\u7c7b\u578b\u53c2\u6570\u4e0b\u79fb\uff08Push Type Parameters Down\uff09<\/h4>\n<p dir=\"auto\">\u4e0b\u9762\u8fd9\u4e24\u4e2a\u51fd\u6570\u7684\u5199\u6cd5\u5f88\u76f8\u4f3c\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function firstElement1&lt;Type&gt;(arr: Type[]) {\n  return arr[0];\n}\n \nfunction firstElement2&lt;Type extends any[]&gt;(arr: Type) {\n  return arr[0];\n}\n \n\/\/ a: number (good)\nconst a = firstElement1([1, 2, 3]);\n\/\/ b: any (bad)\nconst b = firstElement2([1, 2, 3]);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">firstElement1<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">firstElement2<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ a: number (good)<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">a<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">firstElement1<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ b: any (bad)<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">b<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">firstElement2<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7b2c\u4e00\u773c\u770b\u4e0a\u53bb\uff0c\u4e24\u4e2a\u51fd\u6570\u53ef\u592a\u76f8\u4f3c\u4e86\uff0c\u4f46\u662f\u7b2c\u4e00\u4e2a\u51fd\u6570\u7684\u5199\u6cd5\u53ef\u6bd4\u7b2c\u4e8c\u4e2a\u51fd\u6570\u597d\u592a\u591a\u4e86\u3002\u7b2c\u4e00\u4e2a\u51fd\u6570\u53ef\u4ee5\u63a8\u65ad\u51fa\u8fd4\u56de\u7684\u7c7b\u578b\u662f <code class=\"notranslate\">number<\/code>\uff0c\u4f46\u7b2c\u4e8c\u4e2a\u51fd\u6570\u63a8\u65ad\u7684\u8fd4\u56de\u7c7b\u578b\u5374\u662f <code class=\"notranslate\">any<\/code>\uff0c\u56e0\u4e3a TypeScript \u4e0d\u5f97\u4e0d\u7528\u7ea6\u675f\u7684\u7c7b\u578b\u6765\u63a8\u65ad <code class=\"notranslate\">arr[0]<\/code> \u8868\u8fbe\u5f0f\uff0c\u800c\u4e0d\u662f\u7b49\u5230\u51fd\u6570\u8c03\u7528\u7684\u65f6\u5019\u518d\u53bb\u63a8\u65ad\u8fd9\u4e2a\u5143\u7d20\u3002<\/p>\n<p dir=\"auto\">\u5173\u4e8e\u672c\u8282\u539f\u6587\u4e2d\u7684 <code class=\"notranslate\">push down<\/code> \u542b\u4e49\uff0c\u5728\u300a\u91cd\u6784\u300b\u91cc\uff0c\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e0b\u79fb\uff08Push Down Method\uff09\u7684\u4f18\u5316\u65b9\u6cd5\uff0c\u6307\u5982\u679c\u8d85\u7c7b\u4e2d\u7684\u67d0\u4e2a\u51fd\u6570\u53ea\u4e0e\u4e00\u4e2a\u6216\u8005\u5c11\u6570\u51e0\u4e2a\u5b50\u7c7b\u6709\u5173\uff0c\u90a3\u4e48\u6700\u597d\u5c06\u5176\u4ece\u8d85\u7c7b\u4e2d\u632a\u8d70\uff0c\u653e\u5230\u771f\u6b63\u5173\u5fc3\u5b83\u7684\u5b50\u7c7b\u4e2d\u53bb\u3002\u5373\u53ea\u5728\u8d85\u7c7b\u4fdd\u7559\u5171\u7528\u7684\u884c\u4e3a\u3002\u8fd9\u79cd\u5c06\u8d85\u7c7b\u4e2d\u7684\u51fd\u6570\u672c\u4f53\u590d\u5236\u5230\u5177\u4f53\u9700\u8981\u7684\u5b50\u7c7b\u7684\u65b9\u6cd5\u5c31\u53ef\u4ee5\u79f0\u4e4b\u4e3a &#8220;push down&#8221;\uff0c\u4e0e\u672c\u8282\u4e2d\u7684\u53bb\u9664 <code class=\"notranslate\">extend any[]<\/code>\uff0c\u5c06\u5176\u5177\u4f53\u7684\u63a8\u65ad\u4ea4\u7ed9 <code class=\"notranslate\">Type<\/code> \u81ea\u8eab\u5c31\u7c7b\u4f3c\u4e8e <code class=\"notranslate\">push down<\/code>\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">Rule: \u5982\u679c\u53ef\u80fd\u7684\u8bdd\uff0c\u76f4\u63a5\u4f7f\u7528\u7c7b\u578b\u53c2\u6570\u800c\u4e0d\u662f\u7ea6\u675f\u5b83<\/p>\n<\/blockquote>\n<h4 dir=\"auto\">\u4f7f\u7528\u66f4\u5c11\u7684\u7c7b\u578b\u53c2\u6570 (Use Fewer Type Parameters)<\/h4>\n<p dir=\"auto\">\u8fd9\u662f\u53e6\u4e00\u5bf9\u770b\u8d77\u6765\u5f88\u76f8\u4f3c\u7684\u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function filter1&lt;Type&gt;(arr: Type[], func: (arg: Type) =&gt; boolean): Type[] {\n  return arr.filter(func);\n}\n \nfunction filter2&lt;Type, Func extends (arg: Type) =&gt; boolean&gt;(\n  arr: Type[],\n  func: Func\n): Type[] {\n  return arr.filter(func);\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">filter1<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">func<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">filter<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">func<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">filter2<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Func<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">boolean<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span>\n  <span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-s1\">func<\/span>: <span class=\"pl-smi\">Func<\/span>\n<span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">filter<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">func<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u5e76\u6ca1\u6709\u5173\u8054\u4e24\u4e2a\u503c\u7684\u7c7b\u578b\u53c2\u6570 <code class=\"notranslate\">Func<\/code>\uff0c\u8fd9\u662f\u4e00\u4e2a\u5371\u9669\u4fe1\u53f7\uff0c\u56e0\u4e3a\u5b83\u610f\u5473\u7740\u8c03\u7528\u8005\u4e0d\u5f97\u4e0d\u6beb\u65e0\u7406\u7531\u7684\u624b\u52a8\u6307\u5b9a\u4e00\u4e2a\u989d\u5916\u7684\u7c7b\u578b\u53c2\u6570\u3002<code class=\"notranslate\">Func<\/code> \u4ec0\u4e48\u4e5f\u6ca1\u505a\uff0c\u5374\u5bfc\u81f4\u51fd\u6570\u66f4\u96be\u9605\u8bfb\u548c\u63a8\u65ad\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">Rule: \u5c3d\u53ef\u80fd\u7528\u66f4\u5c11\u7684\u7c7b\u578b\u53c2\u6570<\/p>\n<\/blockquote>\n<h4 dir=\"auto\">\u7c7b\u578b\u53c2\u6570\u5e94\u8be5\u51fa\u73b0\u4e24\u6b21 \uff08Type Parameters Should Appear Twice\uff09<\/h4>\n<p dir=\"auto\">\u6709\u7684\u65f6\u5019\u6211\u4eec\u4f1a\u5fd8\u8bb0\u4e00\u4e2a\u51fd\u6570\u5176\u5b9e\u5e76\u4e0d\u9700\u8981\u6cdb\u578b<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function greet&lt;Str extends string&gt;(s: Str) {\n  console.log(\"Hello, \" + s);\n}\n \ngreet(\"world\");'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">greet<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Str<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-c1\">&gt;<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">Str<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Hello, \"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">s<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-en\">greet<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5176\u5b9e\u6211\u4eec\u53ef\u4ee5\u5982\u6b64\u7b80\u5355\u7684\u5199\u8fd9\u4e2a\u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function greet(s: string) {\n  console.log(\"Hello, \" + s);\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">greet<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"Hello, \"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">s<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8bb0\u4f4f\uff1a\u7c7b\u578b\u53c2\u6570\u662f\u7528\u6765\u5173\u8054\u591a\u4e2a\u503c\u4e4b\u95f4\u7684\u7c7b\u578b\u3002\u5982\u679c\u4e00\u4e2a\u7c7b\u578b\u53c2\u6570\u53ea\u5728\u51fd\u6570\u7b7e\u540d\u91cc\u51fa\u73b0\u4e86\u4e00\u6b21\uff0c\u90a3\u5b83\u5c31\u6ca1\u6709\u8ddf\u4efb\u4f55\u4e1c\u897f\u4ea7\u751f\u5173\u8054\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">Rule: \u5982\u679c\u4e00\u4e2a\u7c7b\u578b\u53c2\u6570\u4ec5\u4ec5\u51fa\u73b0\u5728\u4e00\u4e2a\u5730\u65b9\uff0c\u5f3a\u70c8\u5efa\u8bae\u4f60\u91cd\u65b0\u8003\u8651\u662f\u5426\u771f\u7684\u9700\u8981\u5b83<\/p>\n<\/blockquote>\n<h2 dir=\"auto\">\u53ef\u9009\u53c2\u6570\uff08Optional Parameters\uff09<\/h2>\n<p dir=\"auto\">JavaScript \u4e2d\u7684\u51fd\u6570\u7ecf\u5e38\u4f1a\u88ab\u4f20\u5165\u975e\u56fa\u5b9a\u6570\u91cf\u7684\u53c2\u6570\uff0c\u4e3e\u4e2a\u4f8b\u5b50\uff1a<code class=\"notranslate\">number<\/code> \u7684 <code class=\"notranslate\">toFixed<\/code> \u65b9\u6cd5\u5c31\u652f\u6301\u4f20\u5165\u4e00\u4e2a\u53ef\u9009\u7684\u53c2\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function f(n: number) {\n  console.log(n.toFixed()); \/\/ 0 arguments\n  console.log(n.toFixed(3)); \/\/ 1 argument\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toFixed<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 0 arguments<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toFixed<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ 1 argument<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528 <code class=\"notranslate\">?<\/code> \u8868\u793a\u8fd9\u4e2a\u53c2\u6570\u662f\u53ef\u9009\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function f(x?: number) {\n  \/\/ ...\n}\nf(); \/\/ OK\nf(10); \/\/ OK\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ OK<\/span>\n<span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ OK<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5c3d\u7ba1\u8fd9\u4e2a\u53c2\u6570\u88ab\u58f0\u660e\u4e3a <code class=\"notranslate\">number<\/code>\u7c7b\u578b\uff0c<code class=\"notranslate\">x<\/code> \u5b9e\u9645\u4e0a\u7684\u7c7b\u578b\u4e3a <code class=\"notranslate\">number | undefiend<\/code>\uff0c\u8fd9\u662f\u56e0\u4e3a\u5728 JavaScript \u4e2d\u672a\u6307\u5b9a\u7684\u51fd\u6570\u53c2\u6570\u5c31\u4f1a\u88ab\u8d4b\u503c <code class=\"notranslate\">undefined<\/code>\u3002<\/p>\n<p dir=\"auto\">\u4f60\u5f53\u7136\u4e5f\u53ef\u4ee5\u63d0\u4f9b\u6709\u4e00\u4e2a\u53c2\u6570\u9ed8\u8ba4\u503c\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function f(x = 10) {\n  \/\/ ...\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u73b0\u5728\u5728 <code class=\"notranslate\">f<\/code> \u51fd\u6570\u4f53\u5185\uff0c<code class=\"notranslate\">x<\/code> \u7684\u7c7b\u578b\u4e3a <code class=\"notranslate\">number<\/code>\uff0c\u56e0\u4e3a\u4efb\u4f55 <code class=\"notranslate\">undefined<\/code> \u53c2\u6570\u90fd\u4f1a\u88ab\u66ff\u6362\u4e3a <code class=\"notranslate\">10<\/code>\u3002\u6ce8\u610f\u5f53\u4e00\u4e2a\u53c2\u6570\u662f\u53ef\u9009\u7684\uff0c\u8c03\u7528\u7684\u65f6\u5019\u8fd8\u662f\u53ef\u4ee5\u4f20\u5165 <code class=\"notranslate\">undefined<\/code>\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"declare function f(x?: number): void;\n\/\/ cut\n\/\/ All OK\nf();\nf(10);\nf(undefined);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">declare<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ cut<\/span>\n<span class=\"pl-c\">\/\/ All OK<\/span>\n<span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">undefined<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u56de\u8c03\u4e2d\u7684\u53ef\u9009\u53c2\u6570\uff08Optional Parameters in Callbacks\uff09<\/h3>\n<p dir=\"auto\">\u5728\u4f60\u5b66\u4e60\u8fc7\u53ef\u9009\u53c2\u6570\u548c\u51fd\u6570\u7c7b\u578b\u8868\u8fbe\u5f0f\u540e\uff0c\u4f60\u5f88\u5bb9\u6613\u5728\u5305\u542b\u4e86\u56de\u8c03\u51fd\u6570\u7684\u51fd\u6570\u4e2d\uff0c\u72af\u4e0b\u9762\u8fd9\u79cd\u9519\u8bef\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function myForEach(arr: any[], callback: (arg: any, index?: number) =&gt; void) {\n  for (let i = 0; i &lt; arr.length; i++) {\n    callback(arr[i], i);\n  }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">callback<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">index<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-c1\">++<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">callback<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5c06 <code class=\"notranslate\">index?<\/code>\u4f5c\u4e3a\u4e00\u4e2a\u53ef\u9009\u53c2\u6570\uff0c\u672c\u610f\u662f\u5e0c\u671b\u4e0b\u9762\u8fd9\u4e9b\u8c03\u7528\u662f\u5408\u6cd5\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"myForEach([1, 2, 3], (a) =&gt; console.log(a));\nmyForEach([1, 2, 3], (a, i) =&gt; console.log(a, i));\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f46 TypeScript \u5e76\u4e0d\u4f1a\u8fd9\u6837\u8ba4\u4e3a\uff0cTypeScript \u8ba4\u4e3a\u60f3\u8868\u8fbe\u7684\u662f\u56de\u8c03\u51fd\u6570\u53ef\u80fd\u53ea\u4f1a\u88ab\u4f20\u5165\u4e00\u4e2a\u53c2\u6570\uff0c\u6362\u53e5\u8bdd\u8bf4\uff0c<code class=\"notranslate\">myForEach<\/code> \u51fd\u6570\u4e5f\u53ef\u80fd\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function myForEach(arr: any[], callback: (arg: any, index?: number) =&gt; void) {\n  for (let i = 0; i &lt; arr.length; i++) {\n    \/\/ I don't feel like providing the index today\n    callback(arr[i]);\n  }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">callback<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">index<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-c1\">++<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c\">\/\/ I don't feel like providing the index today<\/span>\n    <span class=\"pl-en\">callback<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">TypeScript \u4f1a\u6309\u7167\u8fd9\u4e2a\u610f\u601d\u7406\u89e3\u5e76\u62a5\u9519\uff0c\u5c3d\u7ba1\u5b9e\u9645\u4e0a\u8fd9\u4e2a\u9519\u8bef\u5e76\u65e0\u53ef\u80fd\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"myForEach([1, 2, 3], (a, i) =&gt; {\n  console.log(i.toFixed());\n  \/\/ Object is possibly 'undefined'.\n});\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toFixed<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Object is possibly 'undefined'.<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u90a3\u5982\u4f55\u4fee\u6539\u5462\uff1f\u4e0d\u8bbe\u7f6e\u4e3a\u53ef\u9009\u53c2\u6570\u5176\u5b9e\u5c31\u53ef\u4ee5\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function myForEach(arr: any[], callback: (arg: any, index: number) =&gt; void) {\n  for (let i = 0; i &lt; arr.length; i++) {\n    callback(arr[i], i);\n  }\n}\n\nmyForEach([1, 2, 3], (a, i) =&gt; {\n  console.log(a);\n});\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">callback<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arg<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">index<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">for<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span> <span class=\"pl-c1\">&lt;<\/span> <span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-c1\">++<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-en\">callback<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-en\">myForEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">i<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728 JavaScript \u4e2d\uff0c\u5982\u679c\u4f60\u8c03\u7528\u4e00\u4e2a\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e86\u6bd4\u9700\u8981\u66f4\u591a\u7684\u53c2\u6570\uff0c\u989d\u5916\u7684\u53c2\u6570\u5c31\u4f1a\u88ab\u5ffd\u7565\u3002TypeScript \u4e5f\u662f\u540c\u6837\u7684\u505a\u6cd5\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">\u5f53\u4f60\u5199\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\u7684\u7c7b\u578b\u65f6,\u4e0d\u8981\u5199\u4e00\u4e2a\u53ef\u9009\u53c2\u6570, \u9664\u975e\u4f60\u771f\u7684\u6253\u7b97\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\u4e0d\u4f20\u5165\u5b9e\u53c2<\/p>\n<\/blockquote>\n<h2 dir=\"auto\">\u51fd\u6570\u91cd\u8f7d\uff08Function Overloads\uff09<\/h2>\n<p dir=\"auto\">\u4e00\u4e9b JavaScript \u51fd\u6570\u5728\u8c03\u7528\u7684\u65f6\u5019\u53ef\u4ee5\u4f20\u5165\u4e0d\u540c\u6570\u91cf\u548c\u7c7b\u578b\u7684\u53c2\u6570\u3002\u4e3e\u4e2a\u4f8b\u5b50\u3002\u4f60\u53ef\u4ee5\u5199\u4e00\u4e2a\u51fd\u6570\uff0c\u8fd4\u56de\u4e00\u4e2a\u65e5\u671f\u7c7b\u578b <code class=\"notranslate\">Date<\/code>\uff0c\u8fd9\u4e2a\u51fd\u6570\u63a5\u6536\u4e00\u4e2a\u65f6\u95f4\u6233\uff08\u4e00\u4e2a\u53c2\u6570\uff09\u6216\u8005\u4e00\u4e2a \u6708\/\u65e5\/\u5e74 \u7684\u683c\u5f0f (\u4e09\u4e2a\u53c2\u6570)\u3002<\/p>\n<p dir=\"auto\">\u5728 TypeScript \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5199\u91cd\u8f7d\u7b7e\u540d (overlaod signatures) \u8bf4\u660e\u4e00\u4e2a\u51fd\u6570\u7684\u4e0d\u540c\u8c03\u7528\u65b9\u6cd5\u3002 \u6211\u4eec\u9700\u8981\u5199\u4e00\u4e9b\u51fd\u6570\u7b7e\u540d (\u901a\u5e38\u4e24\u4e2a\u6216\u8005\u66f4\u591a)\uff0c\u7136\u540e\u518d\u5199\u51fd\u6570\u4f53\u7684\u5185\u5bb9\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function makeDate(timestamp: number): Date;\nfunction makeDate(m: number, d: number, y: number): Date;\nfunction makeDate(mOrTimestamp: number, d?: number, y?: number): Date {\n  if (d !== undefined &amp;&amp; y !== undefined) {\n    return new Date(y, mOrTimestamp, d);\n  } else {\n    return new Date(mOrTimestamp);\n  }\n}\nconst d1 = makeDate(12345678);\nconst d2 = makeDate(5, 5, 5);\nconst d3 = makeDate(1, 3);\n\n\/\/ No overload expects 2 arguments, but overloads do exist that expect either 1 or 3 arguments.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">makeDate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">timestamp<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Date<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">makeDate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">m<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">d<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">y<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Date<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">makeDate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">mOrTimestamp<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">d<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">y<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Date<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">d<\/span> <span class=\"pl-c1\">!==<\/span> <span class=\"pl-c1\">undefined<\/span> <span class=\"pl-c1\">&amp;&amp;<\/span> <span class=\"pl-s1\">y<\/span> <span class=\"pl-c1\">!==<\/span> <span class=\"pl-c1\">undefined<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-smi\">Date<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">y<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">mOrTimestamp<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">d<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">else<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-k\">return<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-smi\">Date<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">mOrTimestamp<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">d1<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">makeDate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">12345678<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">d2<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">makeDate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">d3<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">makeDate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ No overload expects 2 arguments, but overloads do exist that expect either 1 or 3 arguments.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u5199\u4e86\u4e24\u4e2a\u51fd\u6570\u91cd\u8f7d\uff0c\u4e00\u4e2a\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570\uff0c\u53e6\u5916\u4e00\u4e2a\u63a5\u53d7\u4e09\u4e2a\u53c2\u6570\u3002\u524d\u9762\u4e24\u4e2a\u51fd\u6570\u7b7e\u540d\u88ab\u79f0\u4e3a\u91cd\u8f7d\u7b7e\u540d (overload signatures)\u3002<\/p>\n<p dir=\"auto\">\u7136\u540e\uff0c\u6211\u4eec\u5199\u4e86\u4e00\u4e2a\u517c\u5bb9\u7b7e\u540d\u7684\u51fd\u6570\u5b9e\u73b0\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5b9e\u73b0\u7b7e\u540d (implementation signature) \uff0c\u4f46\u8fd9\u4e2a\u7b7e\u540d\u4e0d\u80fd\u88ab\u76f4\u63a5\u8c03\u7528\u3002\u5c3d\u7ba1\u6211\u4eec\u5728\u51fd\u6570\u58f0\u660e\u4e2d\uff0c\u5728\u4e00\u4e2a\u5fc5\u987b\u53c2\u6570\u540e\uff0c\u58f0\u660e\u4e86\u4e24\u4e2a\u53ef\u9009\u53c2\u6570\uff0c\u5b83\u4f9d\u7136\u4e0d\u80fd\u88ab\u4f20\u5165\u4e24\u4e2a\u53c2\u6570\u8fdb\u884c\u8c03\u7528\u3002<\/p>\n<h3 dir=\"auto\">\u91cd\u8f7d\u7b7e\u540d\u548c\u5b9e\u73b0\u7b7e\u540d\uff08Overload Signatures and the Implementation Signature\uff09<\/h3>\n<p dir=\"auto\">\u8fd9\u662f\u4e00\u4e2a\u5e38\u89c1\u7684\u56f0\u60d1\u3002\u5927\u5bb6\u5e38\u4f1a\u8fd9\u6837\u5199\u4ee3\u7801\uff0c\u4f46\u662f\u53c8\u4e0d\u7406\u89e3\u4e3a\u4ec0\u4e48\u4f1a\u62a5\u9519\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function fn(x: string): void;\nfunction fn() {\n  \/\/ ...\n}\n\/\/ Expected to be able to call with zero arguments\nfn();\nExpected 1 arguments, but got 0.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-c\">\/\/ Expected to be able to call with zero arguments<\/span>\n<span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">Expected<\/span> <span class=\"pl-c1\">1<\/span> <span class=\"pl-smi\">arguments<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">but<\/span> <span class=\"pl-s1\">got<\/span> <span class=\"pl-c1\">0.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u518d\u6b21\u5f3a\u8c03\u4e00\u4e0b\uff0c\u5199\u8fdb\u51fd\u6570\u4f53\u7684\u7b7e\u540d\u662f\u5bf9\u5916\u90e8\u6765\u8bf4\u662f\u201c\u4e0d\u53ef\u89c1\u201d\u7684\uff0c\u8fd9\u4e5f\u5c31\u610f\u5473\u7740\u5916\u754c\u201c\u770b\u4e0d\u5230\u201d\u5b83\u7684\u7b7e\u540d\uff0c\u81ea\u7136\u4e0d\u80fd\u6309\u7167\u5b9e\u73b0\u7b7e\u540d\u7684\u65b9\u5f0f\u6765\u8c03\u7528\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">\u5b9e\u73b0\u7b7e\u540d\u5bf9\u5916\u754c\u6765\u8bf4\u662f\u4e0d\u53ef\u89c1\u7684\u3002\u5f53\u5199\u4e00\u4e2a\u91cd\u8f7d\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f60\u5e94\u8be5\u603b\u662f\u9700\u8981\u6765\u4e24\u4e2a\u6216\u8005\u66f4\u591a\u7684\u7b7e\u540d\u5728\u5b9e\u73b0\u7b7e\u540d\u4e4b\u4e0a\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u800c\u4e14\u5b9e\u73b0\u7b7e\u540d\u5fc5\u987b\u548c\u91cd\u8f7d\u7b7e\u540d\u5fc5\u987b\u517c\u5bb9\uff08compatible\uff09\uff0c\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u8fd9\u4e9b\u51fd\u6570\u4e4b\u6240\u4ee5\u62a5\u9519\u5c31\u662f\u56e0\u4e3a\u5b83\u4eec\u7684\u5b9e\u73b0\u7b7e\u540d\u5e76\u6ca1\u6709\u6b63\u786e\u7684\u548c\u91cd\u8f7d\u7b7e\u540d\u5339\u914d\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function fn(x: boolean): void;\n\/\/ Argument type isn't right\nfunction fn(x: string): void;\n\/\/ This overload signature is not compatible with its implementation signature.\nfunction fn(x: boolean) {}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Argument type isn't right<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ This overload signature is not compatible with its implementation signature.<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function fn(x: string): string;\n\/\/ Return type isn't right\nfunction fn(x: number): boolean;\nThis overload signature is not compatible with its implementation signature.\nfunction fn(x: string | number) {\n  return &quot;oops&quot;;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Return type isn't right<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">This<\/span> <span class=\"pl-s1\">overload<\/span> <span class=\"pl-s1\">signature<\/span> <span class=\"pl-s1\">is<\/span> <span class=\"pl-s1\">not<\/span> <span class=\"pl-s1\">compatible<\/span> <span class=\"pl-k\">with<\/span> <span class=\"pl-s1\">its<\/span> <span class=\"pl-s1\">implementation<\/span> <span class=\"pl-s1\">signature<\/span><span class=\"pl-kos\">.<\/span>\n<span class=\"pl-en\">function<\/span> <span class=\"pl-s1\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-s1\">string<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-s1\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"oops\"<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u5199\u4e00\u4e2a\u597d\u7684\u51fd\u6570\u91cd\u8f7d\u7684\u4e00\u4e9b\u5efa\u8bae<\/h3>\n<p dir=\"auto\">\u5c31\u50cf\u6cdb\u578b\u4e00\u6837\uff0c\u4e5f\u6709\u4e00\u4e9b\u5efa\u8bae\u63d0\u4f9b\u7ed9\u4f60\u3002\u9075\u5faa\u8fd9\u4e9b\u539f\u5219\uff0c\u53ef\u4ee5\u8ba9\u4f60\u7684\u51fd\u6570\u66f4\u65b9\u4fbf\u8c03\u7528\u3001\u7406\u89e3\u3002<\/p>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u8bbe\u60f3\u8fd9\u6837\u4e00\u4e2a\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u8fd4\u56de\u6570\u7ec4\u6216\u8005\u5b57\u7b26\u4e32\u7684\u957f\u5ea6\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function len(s: string): number;\nfunction len(arr: any[]): number;\nfunction len(x: any) {\n  return x.length;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">arr<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u4e2a\u51fd\u6570\u4ee3\u7801\u529f\u80fd\u5b9e\u73b0\u4e86\uff0c\u4e5f\u6ca1\u6709\u4ec0\u4e48\u62a5\u9519\uff0c\u4f46\u6211\u4eec\u4e0d\u80fd\u4f20\u5165\u4e00\u4e2a\u53ef\u80fd\u662f\u5b57\u7b26\u4e32\u6216\u8005\u662f\u6570\u7ec4\u7684\u503c\uff0c\u56e0\u4e3a TypeScript \u53ea\u80fd\u4e00\u6b21\u7528\u4e00\u4e2a\u51fd\u6570\u91cd\u8f7d\u5904\u7406\u4e00\u6b21\u51fd\u6570\u8c03\u7528\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"len(&quot;&quot;); \/\/ OK\nlen([0]); \/\/ OK\nlen(Math.random() &gt; 0.5 ? &quot;hello&quot; : [0]);\nNo overload matches this call.\n  Overload 1 of 2, '(s: string): number', gave the following error.\n    Argument of type 'number[] | &quot;hello&quot;' is not assignable to parameter of type 'string'.\n      Type 'number[]' is not assignable to type 'string'.\n  Overload 2 of 2, '(arr: any[]): number', gave the following error.\n    Argument of type 'number[] | &quot;hello&quot;' is not assignable to parameter of type 'any[]'.\n      Type 'string' is not assignable to type 'any[]'.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-en\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ OK<\/span>\n<span class=\"pl-en\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ OK<\/span>\n<span class=\"pl-en\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">random<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">0.5<\/span> ? <span class=\"pl-s\">\"hello\"<\/span> : <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-smi\">No<\/span> <span class=\"pl-s1\">overload<\/span> <span class=\"pl-s1\">matches<\/span> <span class=\"pl-s1\">this<\/span> <span class=\"pl-s1\">call<\/span><span class=\"pl-kos\">.<\/span>\n  <span class=\"pl-c1\">Overload<\/span> <span class=\"pl-c1\">1<\/span> <span class=\"pl-k\">of<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'(s: string): number'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">gave<\/span> <span class=\"pl-s1\">the<\/span> <span class=\"pl-s1\">following<\/span> <span class=\"pl-s1\">error<\/span><span class=\"pl-kos\">.<\/span>\n    <span class=\"pl-c1\">Argument<\/span> <span class=\"pl-k\">of<\/span> <span class=\"pl-k\">type<\/span> <span class=\"pl-s\">'number[] | \"hello\"'<\/span> <span class=\"pl-s1\">is<\/span> <span class=\"pl-s1\">not<\/span> <span class=\"pl-s1\">assignable<\/span> <span class=\"pl-s1\">to<\/span> <span class=\"pl-s1\">parameter<\/span> <span class=\"pl-s1\">of<\/span> <span class=\"pl-k\">type<\/span> <span class=\"pl-s\">'string'<\/span><span class=\"pl-kos\">.<\/span>\n      <span class=\"pl-c1\">Type<\/span> <span class=\"pl-s\">'number[]'<\/span> <span class=\"pl-s1\">is<\/span> <span class=\"pl-s1\">not<\/span> <span class=\"pl-s1\">assignable<\/span> <span class=\"pl-s1\">to<\/span> <span class=\"pl-s1\">type<\/span> <span class=\"pl-s\">'string'<\/span><span class=\"pl-kos\">.<\/span>\n  <span class=\"pl-c1\">Overload<\/span> <span class=\"pl-c1\">2<\/span> <span class=\"pl-k\">of<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">'(arr: any[]): number'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">gave<\/span> <span class=\"pl-s1\">the<\/span> <span class=\"pl-s1\">following<\/span> <span class=\"pl-s1\">error<\/span><span class=\"pl-kos\">.<\/span>\n    <span class=\"pl-c1\">Argument<\/span> <span class=\"pl-k\">of<\/span> <span class=\"pl-k\">type<\/span> <span class=\"pl-s\">'number[] | \"hello\"'<\/span> <span class=\"pl-s1\">is<\/span> <span class=\"pl-s1\">not<\/span> <span class=\"pl-s1\">assignable<\/span> <span class=\"pl-s1\">to<\/span> <span class=\"pl-s1\">parameter<\/span> <span class=\"pl-s1\">of<\/span> <span class=\"pl-k\">type<\/span> <span class=\"pl-s\">'any[]'<\/span><span class=\"pl-kos\">.<\/span>\n      <span class=\"pl-c1\">Type<\/span> <span class=\"pl-s\">'string'<\/span> <span class=\"pl-s1\">is<\/span> <span class=\"pl-s1\">not<\/span> <span class=\"pl-s1\">assignable<\/span> <span class=\"pl-s1\">to<\/span> <span class=\"pl-s1\">type<\/span> <span class=\"pl-s\">'any[]'<\/span><span class=\"pl-kos\">.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u56e0\u4e3a\u4e24\u4e2a\u51fd\u6570\u91cd\u8f7d\u90fd\u6709\u76f8\u540c\u7684\u53c2\u6570\u6570\u91cf\u548c\u76f8\u540c\u7684\u8fd4\u56de\u7c7b\u578b\uff0c\u6211\u4eec\u53ef\u4ee5\u5199\u4e00\u4e2a\u65e0\u91cd\u8f7d\u7248\u672c\u7684\u51fd\u6570\u66ff\u4ee3\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function len(x: any[] | string) {\n  return x.length;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">len<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u6837\u51fd\u6570\u5c31\u53ef\u4ee5\u4f20\u5165\u4e24\u4e2a\u7c7b\u578b\u4e2d\u7684\u4efb\u610f\u4e00\u4e2a\u4e86\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">\u5c3d\u53ef\u80fd\u7684\u4f7f\u7528\u8054\u5408\u7c7b\u578b\u66ff\u4ee3\u91cd\u8f7d<\/p>\n<\/blockquote>\n<h3 dir=\"auto\">\u5728\u51fd\u6570\u4e2d\u58f0\u660e this (Declaring <code class=\"notranslate\">this<\/code> in a Function)<\/h3>\n<p dir=\"auto\">TypeScript \u4f1a\u901a\u8fc7\u4ee3\u7801\u6d41\u5206\u6790\u51fd\u6570\u4e2d\u7684 <code class=\"notranslate\">this<\/code> \u4f1a\u662f\u4ec0\u4e48\u7c7b\u578b\uff0c\u4e3e\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const user = {\n  id: 123,\n \n  admin: false,\n  becomeAdmin: function () {\n    this.admin = true;\n  },\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">user<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">id<\/span>: <span class=\"pl-c1\">123<\/span><span class=\"pl-kos\">,<\/span>\n \n  <span class=\"pl-c1\">admin<\/span>: <span class=\"pl-c1\">false<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-en\">becomeAdmin<\/span>: <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">admin<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">TypeScript \u80fd\u591f\u7406\u89e3\u51fd\u6570 <code class=\"notranslate\">user.becomeAdmin<\/code> \u4e2d\u7684 <code class=\"notranslate\">this<\/code> \u6307\u5411\u7684\u662f\u5916\u5c42\u7684\u5bf9\u8c61 <code class=\"notranslate\">user<\/code>\uff0c\u8fd9\u5df2\u7ecf\u53ef\u4ee5\u5e94\u4ed8\u5f88\u591a\u60c5\u51b5\u4e86\uff0c\u4f46\u8fd8\u662f\u6709\u4e00\u4e9b\u60c5\u51b5\u9700\u8981\u4f60\u660e\u786e\u7684\u544a\u8bc9 TypeScript <code class=\"notranslate\">this<\/code> \u5230\u5e95\u4ee3\u8868\u7684\u662f\u4ec0\u4e48\u3002<\/p>\n<p dir=\"auto\">\u5728 JavaScript  \u4e2d\uff0c<code class=\"notranslate\">this<\/code> \u662f\u4fdd\u7559\u5b57\uff0c\u6240\u4ee5\u4e0d\u80fd\u5f53\u505a\u53c2\u6570\u4f7f\u7528\u3002\u4f46 TypeScript \u53ef\u4ee5\u5141\u8bb8\u4f60\u5728\u51fd\u6570\u4f53\u5185\u58f0\u660e <code class=\"notranslate\">this<\/code> \u7684\u7c7b\u578b\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface DB {\n  filterUsers(filter: (this: User) =&gt; boolean): User[];\n}\n \nconst db = getDB();\nconst admins = db.filterUsers(function (this: User) {\n  return this.admin;\n});\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">DB<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">filterUsers<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">filter<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span>: <span class=\"pl-smi\">User<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">User<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">db<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">getDB<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">admins<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">db<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">filterUsers<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span>: <span class=\"pl-smi\">User<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">admin<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u4e2a\u5199\u6cd5\u6709\u70b9\u7c7b\u4f3c\u4e8e\u56de\u8c03\u98ce\u683c\u7684 API\u3002\u6ce8\u610f\u4f60\u9700\u8981\u4f7f\u7528 <code class=\"notranslate\">function<\/code> \u7684\u5f62\u5f0f\u800c\u4e0d\u80fd\u4f7f\u7528\u7bad\u5934\u51fd\u6570\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface DB {\n  filterUsers(filter: (this: User) =&gt; boolean): User[];\n}\n \nconst db = getDB();\nconst admins = db.filterUsers(() =&gt; this.admin);\n\/\/ The containing arrow function captures the global value of 'this'.\n\/\/ Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.\n\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">DB<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">filterUsers<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">filter<\/span>: <span class=\"pl-kos\">(<\/span><span class=\"pl-smi\">this<\/span>: <span class=\"pl-smi\">User<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">User<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">db<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">getDB<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">admins<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">db<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">filterUsers<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\">this<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">admin<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ The containing arrow function captures the global value of 'this'.<\/span>\n<span class=\"pl-c\">\/\/ Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u5176\u4ed6\u9700\u8981\u77e5\u9053\u7684\u7c7b\u578b\uff08Other Types to Know About\uff09<\/h2>\n<p dir=\"auto\">\u8fd9\u91cc\u4ecb\u7ecd\u4e00\u4e9b\u4e5f\u4f1a\u7ecf\u5e38\u51fa\u73b0\u7684\u7c7b\u578b\u3002\u50cf\u5176\u4ed6\u7684\u7c7b\u578b\u4e00\u6837\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u4efb\u4f55\u5730\u65b9\u4f7f\u7528\u5b83\u4eec\uff0c\u4f46\u5b83\u4eec\u7ecf\u5e38\u4e0e\u51fd\u6570\u642d\u914d\u4f7f\u7528\u3002<\/p>\n<h3 dir=\"auto\"><code class=\"notranslate\">void<\/code><\/h3>\n<p dir=\"auto\"><code class=\"notranslate\">void<\/code> \u8868\u793a\u4e00\u4e2a\u51fd\u6570\u5e76\u4e0d\u4f1a\u8fd4\u56de\u4efb\u4f55\u503c\uff0c\u5f53\u51fd\u6570\u5e76\u6ca1\u6709\u4efb\u4f55\u8fd4\u56de\u503c\uff0c\u6216\u8005\u8fd4\u56de\u4e0d\u4e86\u660e\u786e\u7684\u503c\u7684\u65f6\u5019\uff0c\u5c31\u5e94\u8be5\u7528\u8fd9\u79cd\u7c7b\u578b\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ The inferred return type is void\nfunction noop() {\n  return;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ The inferred return type is void<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">noop<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728 JavaScript \u4e2d\uff0c\u4e00\u4e2a\u51fd\u6570\u5e76\u4e0d\u4f1a\u8fd4\u56de\u4efb\u4f55\u503c\uff0c\u4f1a\u9690\u5f0f\u8fd4\u56de <code class=\"notranslate\">undefined<\/code>\uff0c\u4f46\u662f <code class=\"notranslate\">void<\/code> \u548c <code class=\"notranslate\">undefined<\/code> \u5728 TypeScript \u4e2d\u5e76\u4e0d\u4e00\u6837\u3002\u5728\u672c\u6587\u7684\u6700\u540e\u4f1a\u6709\u66f4\u8be6\u7ec6\u7684\u4ecb\u7ecd\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">void  \u8ddf undefined \u4e0d\u4e00\u6837<\/p>\n<\/blockquote>\n<h3 dir=\"auto\"><code class=\"notranslate\">object<\/code><\/h3>\n<p dir=\"auto\">\u8fd9\u4e2a\u7279\u6b8a\u7684\u7c7b\u578b  <code class=\"notranslate\">object<\/code> \u53ef\u4ee5\u8868\u793a\u4efb\u4f55\u4e0d\u662f\u539f\u59cb\u7c7b\u578b\uff08primitive\uff09\u7684\u503c (<code class=\"notranslate\">string<\/code>\u3001<code class=\"notranslate\">number<\/code>\u3001<code class=\"notranslate\">bigint<\/code>\u3001<code class=\"notranslate\">boolean<\/code>\u3001<code class=\"notranslate\">symbol<\/code>\u3001<code class=\"notranslate\">null<\/code>\u3001<code class=\"notranslate\">undefined<\/code>)\u3002<code class=\"notranslate\">object<\/code> \u4e0d\u540c\u4e8e\u7a7a\u5bf9\u8c61\u7c7b\u578b <code class=\"notranslate\">{ }<\/code>\uff0c\u4e5f\u4e0d\u540c\u4e8e\u5168\u5c40\u7c7b\u578b <code class=\"notranslate\">Object<\/code>\u3002\u5f88\u6709\u53ef\u80fd\u4f60\u4e5f\u7528\u4e0d\u5230 <code class=\"notranslate\">Object<\/code>\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">object \u4e0d\u540c\u4e8e <code class=\"notranslate\">Object<\/code> \uff0c\u603b\u662f\u7528 <code class=\"notranslate\">object<\/code>!<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u6ce8\u610f\u5728 JavaScript \u4e2d\uff0c\u51fd\u6570\u5c31\u662f\u5bf9\u8c61\uff0c\u4ed6\u4eec\u53ef\u4ee5\u6709\u5c5e\u6027\uff0c\u5728\u4ed6\u4eec\u7684\u539f\u578b\u94fe\u4e0a\u6709 <code class=\"notranslate\">Object.prototype<\/code>\uff0c\u5e76\u4e14 <code class=\"notranslate\">instanceof Object<\/code>\u3002\u4f60\u53ef\u4ee5\u5bf9\u51fd\u6570\u4f7f\u7528 <code class=\"notranslate\">Object.keys<\/code> \u7b49\u7b49\u3002\u7531\u4e8e\u8fd9\u4e9b\u539f\u56e0\uff0c\u5728 TypeScript \u4e2d\uff0c\u51fd\u6570\u4e5f\u88ab\u8ba4\u4e3a\u662f <code class=\"notranslate\">object<\/code>\u3002<\/p>\n<h3 dir=\"auto\"><code class=\"notranslate\">unknown<\/code><\/h3>\n<p dir=\"auto\"><code class=\"notranslate\">unknown<\/code> \u7c7b\u578b\u53ef\u4ee5\u8868\u793a\u4efb\u4f55\u503c\u3002\u6709\u70b9\u7c7b\u4f3c\u4e8e <code class=\"notranslate\">any<\/code>\uff0c\u4f46\u662f\u66f4\u5b89\u5168\uff0c\u56e0\u4e3a\u5bf9 <code class=\"notranslate\">unknown<\/code> \u7c7b\u578b\u7684\u503c\u505a\u4efb\u4f55\u4e8b\u60c5\u90fd\u662f\u4e0d\u5408\u6cd5\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function f1(a: any) {\n  a.b(); \/\/ OK\n}\nfunction f2(a: unknown) {\n  a.b();\n  \/\/ Object is of type 'unknown'.\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">f1<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">b<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ OK<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">f2<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">unknown<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-s1\">a<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">b<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Object is of type 'unknown'.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6709\u7684\u65f6\u5019\u7528\u6765\u63cf\u8ff0\u51fd\u6570\u7c7b\u578b\uff0c\u8fd8\u662f\u86ee\u6709\u7528\u7684\u3002\u4f60\u53ef\u4ee5\u63cf\u8ff0\u4e00\u4e2a\u51fd\u6570\u53ef\u4ee5\u63a5\u53d7\u4f20\u5165\u4efb\u4f55\u503c\uff0c\u4f46\u662f\u5728\u51fd\u6570\u4f53\u5185\u53c8\u4e0d\u7528\u5230 <code class=\"notranslate\">any<\/code> \u7c7b\u578b\u7684\u503c\u3002<\/p>\n<p dir=\"auto\">\u4f60\u53ef\u4ee5\u63cf\u8ff0\u4e00\u4e2a\u51fd\u6570\u8fd4\u56de\u4e00\u4e2a\u4e0d\u77e5\u9053\u4ec0\u4e48\u7c7b\u578b\u7684\u503c\uff0c\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function safeParse(s: string): unknown {\n  return JSON.parse(s);\n}\n \n\/\/ Need to be careful with 'obj'!\nconst obj = safeParse(someRandomString);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">safeParse<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">unknown<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-smi\">JSON<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">parse<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">s<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ Need to be careful with 'obj'!<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">obj<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">safeParse<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">someRandomString<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\"><code class=\"notranslate\">never<\/code><\/h3>\n<p dir=\"auto\">\u4e00\u4e9b\u51fd\u6570\u4ece\u6765\u4e0d\u8fd4\u56de\u503c\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function fail(msg: string): never {\n  throw new Error(msg);\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">fail<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">msg<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">never<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">throw<\/span> <span class=\"pl-k\">new<\/span> <span class=\"pl-smi\">Error<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">msg<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\"><code class=\"notranslate\">never<\/code> \u7c7b\u578b\u8868\u793a\u4e00\u4e2a\u503c\u4e0d\u4f1a\u518d\u88ab\u89c2\u5bdf\u5230 (observed)\u3002<\/p>\n<p dir=\"auto\">\u4f5c\u4e3a\u4e00\u4e2a\u8fd4\u56de\u7c7b\u578b\u65f6\uff0c\u5b83\u8868\u793a\u8fd9\u4e2a\u51fd\u6570\u4f1a\u4e22\u4e00\u4e2a\u5f02\u5e38\uff0c\u6216\u8005\u4f1a\u7ed3\u675f\u7a0b\u5e8f\u7684\u6267\u884c\u3002<\/p>\n<p dir=\"auto\">\u5f53 TypeScript \u786e\u5b9a\u5728\u8054\u5408\u7c7b\u578b\u4e2d\u5df2\u7ecf\u6ca1\u6709\u53ef\u80fd\u662f\u5176\u4e2d\u7684\u7c7b\u578b\u7684\u65f6\u5019\uff0c<code class=\"notranslate\">never<\/code> \u7c7b\u578b\u4e5f\u4f1a\u51fa\u73b0\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function fn(x: string | number) {\n  if (typeof x === &quot;string&quot;) {\n    \/\/ do something\n  } else if (typeof x === &quot;number&quot;) {\n    \/\/ do something else\n  } else {\n    x; \/\/ has type 'never'!\n  }\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">fn<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">string<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">typeof<\/span> <span class=\"pl-s1\">x<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"string\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c\">\/\/ do something<\/span>\n  <span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">else<\/span> <span class=\"pl-k\">if<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-k\">typeof<\/span> <span class=\"pl-s1\">x<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-s\">\"number\"<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-c\">\/\/ do something else<\/span>\n  <span class=\"pl-kos\">}<\/span> <span class=\"pl-k\">else<\/span> <span class=\"pl-kos\">{<\/span>\n    <span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ has type 'never'!<\/span>\n  <span class=\"pl-kos\">}<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\"><code class=\"notranslate\">Function<\/code><\/h3>\n<p dir=\"auto\">\u5728 JavaScript\uff0c\u5168\u5c40\u7c7b\u578b <code class=\"notranslate\">Function<\/code> \u63cf\u8ff0\u4e86 <code class=\"notranslate\">bind<\/code>\u3001<code class=\"notranslate\">call<\/code>\u3001<code class=\"notranslate\">apply<\/code> \u7b49\u5c5e\u6027\uff0c\u4ee5\u53ca\u5176\u4ed6\u6240\u6709\u7684\u51fd\u6570\u503c\u3002<\/p>\n<p dir=\"auto\">\u5b83\u4e5f\u6709\u4e00\u4e2a\u7279\u6b8a\u7684\u6027\u8d28\uff0c\u5c31\u662f <code class=\"notranslate\">Function<\/code> \u7c7b\u578b\u7684\u503c\u603b\u662f\u53ef\u4ee5\u88ab\u8c03\u7528\uff0c\u7ed3\u679c\u4f1a\u8fd4\u56de <code class=\"notranslate\">any<\/code> \u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doSomething(f: Function) {\n  f(1, 2, 3);\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">doSomething<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">f<\/span>: <span class=\"pl-smi\">Function<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">f<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u662f\u4e00\u4e2a\u65e0\u7c7b\u578b\u51fd\u6570\u8c03\u7528 (untyped function call)\uff0c\u8fd9\u79cd\u8c03\u7528\u6700\u597d\u88ab\u907f\u514d\uff0c\u56e0\u4e3a\u5b83\u8fd4\u56de\u7684\u662f\u4e00\u4e2a\u4e0d\u5b89\u5168\u7684 <code class=\"notranslate\">any<\/code>\u7c7b\u578b\u3002<\/p>\n<p dir=\"auto\">\u5982\u679c\u4f60\u51c6\u5907\u63a5\u53d7\u4e00\u4e2a\u9ed1\u76d2\u7684\u51fd\u6570\uff0c\u4f46\u662f\u53c8\u4e0d\u6253\u7b97\u8c03\u7528\u5b83\uff0c<code class=\"notranslate\">() =&gt; void<\/code> \u4f1a\u66f4\u5b89\u5168\u4e00\u4e9b\u3002<\/p>\n<h2 dir=\"auto\">\u5269\u4f59\u53c2\u6570\uff08Rest Parameters and Arguments\uff09<\/h2>\n<h3 dir=\"auto\"><code class=\"notranslate\">parameters<\/code> \u4e0e <code class=\"notranslate\">arguments<\/code><\/h3>\n<p dir=\"auto\"><code class=\"notranslate\">arguments<\/code> \u548c <code class=\"notranslate\">parameters<\/code> \u90fd\u53ef\u4ee5\u8868\u793a\u51fd\u6570\u7684\u53c2\u6570\uff0c\u7531\u4e8e\u672c\u8282\u5185\u5bb9\u505a\u4e86\u5177\u4f53\u7684\u533a\u5206\uff0c\u6240\u4ee5\u6211\u4eec\u5b9a\u4e49 <code class=\"notranslate\">parameters<\/code> \u8868\u793a\u6211\u4eec\u5b9a\u4e49\u51fd\u6570\u65f6\u8bbe\u7f6e\u7684\u540d\u5b57\u5373\u5f62\u53c2\uff0c<code class=\"notranslate\">arguments<\/code> \u8868\u793a\u6211\u4eec\u5b9e\u9645\u4f20\u5165\u51fd\u6570\u7684\u53c2\u6570\u5373\u5b9e\u53c2\u3002<\/p>\n<h3 dir=\"auto\">\u5269\u4f59\u53c2\u6570\uff08Rest Parameters\uff09<\/h3>\n<p dir=\"auto\">\u9664\u4e86\u7528\u53ef\u9009\u53c2\u6570\u3001\u91cd\u8f7d\u80fd\u8ba9\u51fd\u6570\u63a5\u6536\u4e0d\u540c\u6570\u91cf\u7684\u51fd\u6570\u53c2\u6570\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528\u5269\u4f59\u53c2\u6570\u8bed\u6cd5\uff08rest parameters\uff09\uff0c\u5b9a\u4e49\u4e00\u4e2a\u53ef\u4ee5\u4f20\u5165\u6570\u91cf\u4e0d\u53d7\u9650\u5236\u7684\u51fd\u6570\u53c2\u6570\u7684\u51fd\u6570\uff1a<\/p>\n<p dir=\"auto\">\u5269\u4f59\u53c2\u6570\u5fc5\u987b\u653e\u5728\u6240\u6709\u53c2\u6570\u7684\u6700\u540e\u9762\uff0c\u5e76\u4f7f\u7528 <code class=\"notranslate\">...<\/code> \u8bed\u6cd5\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function multiply(n: number, ...m: number[]) {\n  return m.map((x) =&gt; n * x);\n}\n\/\/ 'a' gets value [10, 20, 30, 40]\nconst a = multiply(10, 1, 2, 3, 4);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">multiply<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">n<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> ...<span class=\"pl-s1\">m<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s1\">m<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">map<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-s1\">n<\/span> <span class=\"pl-c1\">*<\/span> <span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-c\">\/\/ 'a' gets value [10, 20, 30, 40]<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">a<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">multiply<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728 TypeScript \u4e2d\uff0c\u5269\u4f59\u53c2\u6570\u7684\u7c7b\u578b\u4f1a\u88ab\u9690\u5f0f\u8bbe\u7f6e\u4e3a <code class=\"notranslate\">any[]<\/code> \u800c\u4e0d\u662f <code class=\"notranslate\">any<\/code>\uff0c\u5982\u679c\u4f60\u8981\u8bbe\u7f6e\u5177\u4f53\u7684\u7c7b\u578b\uff0c\u5fc5\u987b\u662f <code class=\"notranslate\">Array&lt;T&gt;<\/code> \u6216\u8005 <code class=\"notranslate\">T[]<\/code>\u7684\u5f62\u5f0f\uff0c\u518d\u6216\u8005\u5c31\u662f\u5143\u7ec4\u7c7b\u578b\uff08tuple type\uff09\u3002<\/p>\n<h3 dir=\"auto\">\u5269\u4f59\u53c2\u6570\uff08Rest Arguments\uff09<\/h3>\n<p dir=\"auto\">\u6211\u4eec\u53ef\u4ee5\u501f\u52a9\u4e00\u4e2a\u4f7f\u7528 <code class=\"notranslate\">...<\/code> \u8bed\u6cd5\u7684\u6570\u7ec4\uff0c\u4e3a\u51fd\u6570\u63d0\u4f9b\u4e0d\u5b9a\u6570\u91cf\u7684\u5b9e\u53c2\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u6570\u7ec4\u7684 <code class=\"notranslate\">push<\/code> \u65b9\u6cd5\u5c31\u53ef\u4ee5\u63a5\u53d7\u4efb\u4f55\u6570\u91cf\u7684\u5b9e\u53c2\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const arr1 = [1, 2, 3];\nconst arr2 = [4, 5, 6];\narr1.push(...arr2);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">arr1<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">arr2<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">4<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">6<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">arr1<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">push<\/span><span class=\"pl-kos\">(<\/span>...<span class=\"pl-s1\">arr2<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6ce8\u610f\u4e00\u822c\u60c5\u51b5\u4e0b\uff0cTypeScript \u5e76\u4e0d\u4f1a\u5047\u5b9a\u6570\u7ec4\u662f\u4e0d\u53d8\u7684(immutable)\uff0c\u8fd9\u4f1a\u5bfc\u81f4\u4e00\u4e9b\u610f\u5916\u7684\u884c\u4e3a\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\/\/ \u7c7b\u578b\u88ab\u63a8\u65ad\u4e3a number[] -- \"an array with zero or more numbers\",\n\/\/ not specifically two numbers\nconst args = [8, 5];\nconst angle = Math.atan2(...args);\n\/\/ A spread argument must either have a tuple type or be passed to a rest parameter.'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u7c7b\u578b\u88ab\u63a8\u65ad\u4e3a number[] -- \"an array with zero or more numbers\",<\/span>\n<span class=\"pl-c\">\/\/ not specifically two numbers<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">args<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">8<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">angle<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">atan2<\/span><span class=\"pl-kos\">(<\/span>...<span class=\"pl-s1\">args<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ A spread argument must either have a tuple type or be passed to a rest parameter.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4fee\u590d\u8fd9\u4e2a\u95ee\u9898\u9700\u8981\u4f60\u5199\u4e00\u70b9\u4ee3\u7801\uff0c\u901a\u5e38\u6765\u8bf4, \u4f7f\u7528 <code class=\"notranslate\">as const<\/code> \u662f\u6700\u76f4\u63a5\u6709\u6548\u7684\u89e3\u51b3\u65b9\u6cd5\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ Inferred as 2-length tuple\nconst args = [8, 5] as const;\n\/\/ OK\nconst angle = Math.atan2(...args);\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ Inferred as 2-length tuple<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">args<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">8<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">5<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-smi\">const<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ OK<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">angle<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">atan2<\/span><span class=\"pl-kos\">(<\/span>...<span class=\"pl-s1\">args<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u901a\u8fc7 <code class=\"notranslate\">as const<\/code> \u8bed\u6cd5\u5c06\u5176\u53d8\u4e3a\u53ea\u8bfb\u5143\u7ec4\u4fbf\u53ef\u4ee5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<p dir=\"auto\">\u6ce8\u610f\u5f53\u4f60\u8981\u8fd0\u884c\u5728\u6bd4\u8f83\u8001\u7684\u73af\u5883\u65f6\uff0c\u4f7f\u7528\u5269\u4f59\u53c2\u6570\u8bed\u6cd5\u4e5f\u8bb8\u9700\u8981\u4f60\u5f00\u542f <code class=\"notranslate\">[downlevelIteration](https:\/\/www.typescriptlang.org\/tsconfig#downlevelIteration)<\/code> \uff0c\u5c06\u4ee3\u7801\u8f6c\u6362\u4e3a\u65e7\u7248\u672c\u7684 JavaScript\u3002<\/p>\n<h2 dir=\"auto\">\u53c2\u6570\u89e3\u6784\uff08Parameter Destructuring\uff09<\/h2>\n<p dir=\"auto\">\u4f60\u53ef\u4ee5\u4f7f\u7528\u53c2\u6570\u89e3\u6784\u65b9\u4fbf\u7684\u5c06\u4f5c\u4e3a\u53c2\u6570\u63d0\u4f9b\u7684\u5bf9\u8c61\u89e3\u6784\u4e3a\u51fd\u6570\u4f53\u5185\u4e00\u4e2a\u6216\u8005\u591a\u4e2a\u5c40\u90e8\u53d8\u91cf\uff0c\u5728 JavaScript \u4e2d\uff0c\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function sum({ a, b, c }) {\n  console.log(a + b + c);\n}\nsum({ a: 10, b: 3, c: 9 });\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">sum<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> a<span class=\"pl-kos\">,<\/span> b<span class=\"pl-kos\">,<\/span> c <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">b<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">c<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-en\">sum<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">a<\/span>: <span class=\"pl-c1\">10<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">b<\/span>: <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">c<\/span>: <span class=\"pl-c1\">9<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u89e3\u6784\u8bed\u6cd5\u540e\uff0c\u8981\u5199\u4e0a\u5bf9\u8c61\u7684\u7c7b\u578b\u6ce8\u89e3\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function sum({ a, b, c }: { a: number; b: number; c: number }) {\n  console.log(a + b + c);\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">sum<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> a<span class=\"pl-kos\">,<\/span> b<span class=\"pl-kos\">,<\/span> c <span class=\"pl-kos\">}<\/span>: <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">a<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c1\">b<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c1\">c<\/span>: <span class=\"pl-smi\">number<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">b<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">c<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u4e2a\u770b\u8d77\u6765\u6709\u4e9b\u7e41\u7410\uff0c\u4f60\u4e5f\u53ef\u4ee5\u8fd9\u6837\u5199\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"\/\/ \u8ddf\u4e0a\u9762\u662f\u6709\u4e00\u6837\u7684\ntype ABC = { a: number; b: number; c: number };\nfunction sum({ a, b, c }: ABC) {\n  console.log(a + b + c);\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-c\">\/\/ \u8ddf\u4e0a\u9762\u662f\u6709\u4e00\u6837\u7684<\/span>\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">ABC<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">a<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c1\">b<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c1\">c<\/span>: <span class=\"pl-smi\">number<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">sum<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> a<span class=\"pl-kos\">,<\/span> b<span class=\"pl-kos\">,<\/span> c <span class=\"pl-kos\">}<\/span>: <span class=\"pl-smi\">ABC<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">a<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">b<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">c<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u51fd\u6570\u7684\u53ef\u8d4b\u503c\u6027 \uff08Assignability of Functions\uff09<\/h2>\n<h3 dir=\"auto\">\u8fd4\u56de <code class=\"notranslate\">void<\/code><\/h3>\n<p dir=\"auto\">\u51fd\u6570\u6709\u4e00\u4e2a <code class=\"notranslate\">void<\/code> \u8fd4\u56de\u7c7b\u578b\uff0c\u4f1a\u4ea7\u751f\u4e00\u4e9b\u610f\u6599\u4e4b\u5916\uff0c\u60c5\u7406\u4e4b\u4e2d\u7684\u884c\u4e3a\u3002<\/p>\n<p dir=\"auto\">\u5f53\u57fa\u4e8e\u4e0a\u4e0b\u6587\u7684\u7c7b\u578b\u63a8\u5bfc\uff08Contextual Typing\uff09\u63a8\u5bfc\u51fa\u8fd4\u56de\u7c7b\u578b\u4e3a <code class=\"notranslate\">void<\/code> \u7684\u65f6\u5019\uff0c\u5e76\u4e0d\u4f1a\u5f3a\u5236\u51fd\u6570\u4e00\u5b9a\u4e0d\u80fd\u8fd4\u56de\u5185\u5bb9\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5982\u679c\u8fd9\u6837\u4e00\u4e2a\u8fd4\u56de <code class=\"notranslate\">void<\/code> \u7c7b\u578b\u7684\u51fd\u6570\u7c7b\u578b <code class=\"notranslate\">(type vf = () =&gt; void)<\/code>\uff0c<br \/>\n\u5f53\u88ab\u5e94\u7528\u7684\u65f6\u5019\uff0c\u4e5f\u662f\u53ef\u4ee5\u8fd4\u56de\u4efb\u4f55\u503c\u7684\uff0c\u4f46\u8fd4\u56de\u7684\u503c\u4f1a\u88ab\u5ffd\u7565\u6389\u3002<\/p>\n<p dir=\"auto\">\u56e0\u6b64\uff0c\u4e0b\u9762\u8fd9\u4e9b<code class=\"notranslate\">() =&gt; void<\/code> \u7c7b\u578b\u7684\u5b9e\u73b0\u90fd\u662f\u6709\u6548\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type voidFunc = () =&gt; void;\n \nconst f1: voidFunc = () =&gt; {\n  return true;\n};\n \nconst f2: voidFunc = () =&gt; true;\n \nconst f3: voidFunc = function () {\n  return true;\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">voidFunc<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-en\">f1<\/span>: <span class=\"pl-smi\">voidFunc<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-en\">f2<\/span>: <span class=\"pl-smi\">voidFunc<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-en\">f3<\/span>: <span class=\"pl-smi\">voidFunc<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u800c\u4e14\u5373\u4fbf\u8fd9\u4e9b\u51fd\u6570\u7684\u8fd4\u56de\u503c\u8d4b\u503c\u7ed9\u5176\u4ed6\u53d8\u91cf\uff0c\u4e5f\u4f1a\u7ef4\u6301 <code class=\"notranslate\">void<\/code> \u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const v1 = f1();\n \nconst v2 = f2();\n \nconst v3 = f3();\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">v1<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">f1<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">v2<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">f2<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">v3<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">f3<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6b63\u662f\u56e0\u4e3a\u8fd9\u4e2a\u7279\u6027\u7684\u5b58\u5728\uff0c\u6240\u4ee5\u63a5\u4e0b\u6765\u7684\u4ee3\u7801\u624d\u4f1a\u662f\u6709\u6548\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const src = [1, 2, 3];\nconst dst = [0];\n \nsrc.forEach((el) =&gt; dst.push(el));\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">src<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">dst<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-s1\">src<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">forEach<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">el<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-c1\">=&gt;<\/span> <span class=\"pl-s1\">dst<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">push<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">el<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5c3d\u7ba1 <code class=\"notranslate\">Array.prototype.push<\/code> \u8fd4\u56de\u4e00\u4e2a\u6570\u5b57\uff0c\u5e76\u4e14 <code class=\"notranslate\">Array.prototype.forEach<\/code> \u65b9\u6cd5\u671f\u5f85\u4e00\u4e2a\u8fd4\u56de <code class=\"notranslate\">void<\/code> \u7c7b\u578b\u7684\u51fd\u6570\uff0c\u4f46\u8fd9\u6bb5\u4ee3\u7801\u4f9d\u7136\u6ca1\u6709\u62a5\u9519\u3002\u5c31\u662f\u56e0\u4e3a\u57fa\u4e8e\u4e0a\u4e0b\u6587\u63a8\u5bfc\uff0c\u63a8\u5bfc\u51fa forEach \u51fd\u6570\u8fd4\u56de\u7c7b\u578b\u4e3a void\uff0c\u6b63\u662f\u56e0\u4e3a\u4e0d\u5f3a\u5236\u51fd\u6570\u4e00\u5b9a\u4e0d\u80fd\u8fd4\u56de\u5185\u5bb9\uff0c\u6240\u4ee5\u4e0a\u9762\u8fd9\u79cd <code class=\"notranslate\">return dst.push(el)<\/code> \u7684\u5199\u6cd5\u624d\u4e0d\u4f1a\u62a5\u9519\u3002<\/p>\n<p dir=\"auto\">\u53e6\u5916\u8fd8\u6709\u4e00\u4e2a\u7279\u6b8a\u7684\u4f8b\u5b50\u9700\u8981\u6ce8\u610f\uff0c\u5f53\u4e00\u4e2a\u51fd\u6570\u5b57\u9762\u91cf\u5b9a\u4e49\u8fd4\u56de\u4e00\u4e2a <code class=\"notranslate\">void<\/code> \u7c7b\u578b\uff0c\u51fd\u6570\u662f\u4e00\u5b9a\u4e0d\u80fd\u8fd4\u56de\u4efb\u4f55\u4e1c\u897f\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function f2(): void {\n  \/\/ @ts-expect-error\n  return true;\n}\n \nconst f3 = function (): void {\n  \/\/ @ts-expect-error\n  return true;\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">f2<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ @ts-expect-error<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-en\">f3<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-k\">function<\/span> <span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\"><span class=\"pl-k\">void<\/span><\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ @ts-expect-error<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">TypeScript \u7cfb\u5217<\/h2>\n<p dir=\"auto\">TypeScript \u7cfb\u5217\u6587\u7ae0\u7531\u5b98\u65b9\u6587\u6863\u7ffb\u8bd1\u3001\u91cd\u96be\u70b9\u89e3\u6790\u3001\u5b9e\u6218\u6280\u5de7\u4e09\u4e2a\u90e8\u5206\u7ec4\u6210\uff0c\u6db5\u76d6\u5165\u95e8\u3001\u8fdb\u9636\u3001\u5b9e\u6218\uff0c\u65e8\u5728\u4e3a\u4f60\u63d0\u4f9b\u4e00\u4e2a\u7cfb\u7edf\u5b66\u4e60 TS \u7684\u6559\u7a0b\uff0c\u5168\u7cfb\u5217\u9884\u8ba1 40 \u7bc7\u5de6\u53f3\u3002<a href=\"http:\/\/ts.yayujs.com\/\" rel=\"nofollow\">\u70b9\u6b64\u6d4f\u89c8\u5168\u7cfb\u5217\u6587\u7ae0\uff0c\u5e76\u5efa\u8bae\u987a\u4fbf\u6536\u85cf\u7ad9\u70b9\u3002<\/a><\/p>\n<p dir=\"auto\">\u5fae\u4fe1\uff1a\u300cmqyqingfeng\u300d\uff0c\u52a0\u6211\u8fdb\u51b4\u7fbd\u552f\u4e00\u7684\u8bfb\u8005\u7fa4\u3002<\/p>\n<\/td>\n<p>\u6587\u7ae0\u8f6c\u8f7d\u81ea<a href='https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/220'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/220<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 TypeScript \u7684\u5b98\u65b9\u6587\u6863\u65e9\u5df2\u66f4\u65b0\uff0c\u4f46\u6211\u80fd\u627e\u5230\u7684\u4e2d\u6587\u6587\u6863\u90fd\u8fd8\u505c\u7559\u5728\u6bd4\u8f83\u8001\u7684\u7248\u672c\u3002\u6240\u4ee5\u5bf9\u5176\u4e2d\u65b0\u589e\u4ee5\u53ca\u4fee\u8ba2\u8f83\u591a\u7684\u4e00\u4e9b\u7ae0\u8282\u8fdb\u884c\u4e86\u7ffb\u8bd1\u6574\u7406\u3002 \u672c\u7bc7\u6574\u7406\u81ea T&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.lccc.top\/?p=1413\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1413","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1413"}],"collection":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1413"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1413\/revisions"}],"predecessor-version":[{"id":2401,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1413\/revisions\/2401"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}