{"id":1412,"date":"2024-06-02T23:00:18","date_gmt":"2024-06-02T23:00:18","guid":{"rendered":""},"modified":"2024-06-05T06:12:46","modified_gmt":"2024-06-04T22:12:46","slug":"typescript-%e4%b9%8b-object-types","status":"publish","type":"post","link":"https:\/\/www.lccc.top\/?p=1412","title":{"rendered":"TypeScript \u4e4b Object Types"},"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\/objects.html\" rel=\"nofollow\">Object Types<\/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\">\u5bf9\u8c61\u7c7b\u578b\uff08Object types\uff09<\/h2>\n<p dir=\"auto\">\u5728 JavaScript \u4e2d\uff0c\u6700\u57fa\u672c\u7684\u5c06\u6570\u636e\u6210\u7ec4\u548c\u5206\u53d1\u7684\u65b9\u5f0f\u5c31\u662f\u901a\u8fc7\u5bf9\u8c61\u3002\u5728 TypeScript \u4e2d\uff0c\u6211\u4eec\u901a\u8fc7\u5bf9\u8c61\u7c7b\u578b\uff08object types\uff09\u6765\u63cf\u8ff0\u5bf9\u8c61\u3002<\/p>\n<p dir=\"auto\">\u5bf9\u8c61\u7c7b\u578b\u53ef\u4ee5\u662f\u533f\u540d\u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function greet(person: { name: string; age: number }) {\n  return \"Hello \" + person.name;\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\">person<\/span>: <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c1\">age<\/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-k\">return<\/span> <span class=\"pl-s\">\"Hello \"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">person<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">name<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e5f\u53ef\u4ee5\u4f7f\u7528\u63a5\u53e3\u8fdb\u884c\u5b9a\u4e49\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='interface Person {\n  name: string;\n  age: number;\n}\n \nfunction greet(person: Person) {\n  return \"Hello \" + person.name;\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Person<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">age<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">greet<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">person<\/span>: <span class=\"pl-smi\">Person<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"Hello \"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">person<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">name<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6216\u8005\u901a\u8fc7\u7c7b\u578b\u522b\u540d\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='type Person = {\n  name: string;\n  age: number;\n};\n \nfunction greet(person: Person) {\n  return \"Hello \" + person.name;\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Person<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">age<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">greet<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">person<\/span>: <span class=\"pl-smi\">Person<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">return<\/span> <span class=\"pl-s\">\"Hello \"<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">person<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">name<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u5c5e\u6027\u4fee\u9970\u7b26\uff08Property Modifiers\uff09<\/h2>\n<p dir=\"auto\">\u5bf9\u8c61\u7c7b\u578b\u4e2d\u7684\u6bcf\u4e2a\u5c5e\u6027\u53ef\u4ee5\u8bf4\u660e\u5b83\u7684\u7c7b\u578b\u3001\u5c5e\u6027\u662f\u5426\u53ef\u9009\u3001\u5c5e\u6027\u662f\u5426\u53ea\u8bfb\u7b49\u4fe1\u606f\u3002<\/p>\n<h3 dir=\"auto\">\u53ef\u9009\u5c5e\u6027\uff08Optional Properties\uff09<\/h3>\n<p dir=\"auto\">\u6211\u4eec\u53ef\u4ee5\u5728\u5c5e\u6027\u540d\u540e\u9762\u52a0\u4e00\u4e2a <code class=\"notranslate\">?<\/code> \u6807\u8bb0\u8868\u793a\u8fd9\u4e2a\u5c5e\u6027\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=\"interface PaintOptions {\n  shape: Shape;\n  xPos?: number;\n  yPos?: number;\n}\n \nfunction paintShape(opts: PaintOptions) {\n  \/\/ ...\n}\n \nconst shape = getShape();\npaintShape({ shape });\npaintShape({ shape, xPos: 100 });\npaintShape({ shape, yPos: 100 });\npaintShape({ shape, xPos: 100, yPos: 100 });\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">PaintOptions<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">shape<\/span>: <span class=\"pl-smi\">Shape<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">xPos<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">yPos<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">opts<\/span>: <span class=\"pl-smi\">PaintOptions<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">shape<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">getShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> shape <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> shape<span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">xPos<\/span>: <span class=\"pl-c1\">100<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> shape<span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">yPos<\/span>: <span class=\"pl-c1\">100<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> shape<span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">xPos<\/span>: <span class=\"pl-c1\">100<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">yPos<\/span>: <span class=\"pl-c1\">100<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c<code class=\"notranslate\">xPos<\/code> \u548c <code class=\"notranslate\">yPos<\/code> \u5c31\u662f\u53ef\u9009\u5c5e\u6027\u3002\u56e0\u4e3a\u4ed6\u4eec\u662f\u53ef\u9009\u7684\uff0c\u6240\u4ee5\u4e0a\u9762\u6240\u6709\u7684\u8c03\u7528\u65b9\u5f0f\u90fd\u662f\u5408\u6cd5\u7684\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u4e5f\u53ef\u4ee5\u5c1d\u8bd5\u8bfb\u53d6\u8fd9\u4e9b\u5c5e\u6027\uff0c\u4f46\u5982\u679c\u6211\u4eec\u662f\u5728 <code class=\"notranslate\">strictNullChecks<\/code> \u6a21\u5f0f\u4e0b\uff0cTypeScript \u4f1a\u63d0\u793a\u6211\u4eec\uff0c\u5c5e\u6027\u503c\u53ef\u80fd\u662f <code class=\"notranslate\">undefined<\/code>\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function paintShape(opts: PaintOptions) {\n  let xPos = opts.xPos;              \n  \/\/ (property) PaintOptions.xPos?: number | undefined\n  let yPos = opts.yPos;\n  \/\/ (property) PaintOptions.yPos?: number | undefined\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">opts<\/span>: <span class=\"pl-smi\">PaintOptions<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">xPos<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">opts<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">xPos<\/span><span class=\"pl-kos\">;<\/span>              \n  <span class=\"pl-c\">\/\/ (property) PaintOptions.xPos?: number | undefined<\/span>\n  <span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">yPos<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">opts<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">yPos<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ (property) PaintOptions.yPos?: number | undefined<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728 JavaScript \u4e2d\uff0c\u5982\u679c\u4e00\u4e2a\u5c5e\u6027\u503c\u6ca1\u6709\u88ab\u8bbe\u7f6e\uff0c\u6211\u4eec\u83b7\u53d6\u4f1a\u5f97\u5230 <code class=\"notranslate\">undefined<\/code> \u3002\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u9488\u5bf9 <code class=\"notranslate\">undefined<\/code> \u7279\u6b8a\u5904\u7406\u4e00\u4e0b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function paintShape(opts: PaintOptions) {\n  let xPos = opts.xPos === undefined ? 0 : opts.xPos;\n  \/\/ let xPos: number\n  let yPos = opts.yPos === undefined ? 0 : opts.yPos;\n  \/\/ let yPos: number\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">opts<\/span>: <span class=\"pl-smi\">PaintOptions<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">xPos<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">opts<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">xPos<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-c1\">undefined<\/span> ? <span class=\"pl-c1\">0<\/span> : <span class=\"pl-s1\">opts<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">xPos<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ let xPos: number<\/span>\n  <span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">yPos<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">opts<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">yPos<\/span> <span class=\"pl-c1\">===<\/span> <span class=\"pl-c1\">undefined<\/span> ? <span class=\"pl-c1\">0<\/span> : <span class=\"pl-s1\">opts<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">yPos<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ let yPos: number<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u79cd\u5224\u65ad\u5728 JavaScript \u4e2d\u5f88\u5e38\u89c1\uff0c\u4ee5\u81f3\u4e8e\u63d0\u4f9b\u4e86\u4e13\u95e8\u7684\u8bed\u6cd5\u7cd6\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function paintShape({ shape, xPos = 0, yPos = 0 }: PaintOptions) {\n  console.log(\"x coordinate at\", xPos); \/\/ (parameter) xPos: number\n  console.log(\"y coordinate at\", yPos); \/\/ (parameter) yPos: number\n  \/\/ ...\n}'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">paintShape<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> shape<span class=\"pl-kos\">,<\/span> xPos <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">,<\/span> yPos <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">0<\/span> <span class=\"pl-kos\">}<\/span>: <span class=\"pl-smi\">PaintOptions<\/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\">\"x coordinate at\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">xPos<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ (parameter) xPos: number<\/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\">\"y coordinate at\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">yPos<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ (parameter) yPos: number<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528\u4e86\u89e3\u6784\u8bed\u6cd5\u4ee5\u53ca\u4e3a <code class=\"notranslate\">xPos<\/code> \u548c <code class=\"notranslate\">yPos<\/code> \u63d0\u4f9b\u4e86\u9ed8\u8ba4\u503c\u3002\u73b0\u5728 <code class=\"notranslate\">xPos<\/code> \u548c <code class=\"notranslate\">yPos<\/code> \u7684\u503c\u5728 <code class=\"notranslate\">paintShape<\/code> \u51fd\u6570\u5185\u90e8\u4e00\u5b9a\u5b58\u5728\uff0c\u4f46\u5bf9\u4e8e <code class=\"notranslate\">paintShape<\/code> \u7684\u8c03\u7528\u8005\u6765\u8bf4\uff0c\u5374\u662f\u53ef\u9009\u7684\u3002<\/p>\n<blockquote>\n<p dir=\"auto\">\u6ce8\u610f\u73b0\u5728\u5e76\u6ca1\u6709\u5728\u89e3\u6784\u8bed\u6cd5\u91cc\u653e\u7f6e\u7c7b\u578b\u6ce8\u89e3\u7684\u65b9\u5f0f\u3002\u8fd9\u662f\u56e0\u4e3a\u5728 JavaScript \u4e2d\uff0c\u4e0b\u9762\u7684\u8bed\u6cd5\u4ee3\u8868\u7684\u610f\u601d\u5b8c\u5168\u4e0d\u540c\u3002<\/p>\n<\/blockquote>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function draw({ shape: Shape, xPos: number = 100 \/*...*\/ }) {\n  render(shape);\n  \/\/ Cannot find name 'shape'. Did you mean 'Shape'?\n  render(xPos);\n  \/\/ Cannot find name 'xPos'.\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">draw<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">shape<\/span>: <span class=\"pl-smi\">Shape<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">xPos<\/span>: <span class=\"pl-s1\">number<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-c1\">100<\/span> <span class=\"pl-c\">\/*...*\/<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">shape<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Cannot find name 'shape'. Did you mean 'Shape'?<\/span>\n  <span class=\"pl-en\">render<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">xPos<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Cannot find name 'xPos'.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u5bf9\u8c61\u89e3\u6784\u8bed\u6cd5\u4e2d\uff0c<code class=\"notranslate\">shape: Shape<\/code> \u8868\u793a\u7684\u662f\u628a <code class=\"notranslate\">shape<\/code> \u7684\u503c\u8d4b\u503c\u7ed9\u5c40\u90e8\u53d8\u91cf <code class=\"notranslate\">Shape<\/code>\u3002 <code class=\"notranslate\">xPos: number<\/code> \u4e5f\u662f\u4e00\u6837\uff0c\u4f1a\u57fa\u4e8e <code class=\"notranslate\">xPos<\/code> \u521b\u5efa\u4e00\u4e2a\u540d\u4e3a <code class=\"notranslate\">number<\/code> \u7684\u53d8\u91cf\u3002<\/p>\n<h3 dir=\"auto\"><code class=\"notranslate\">readonly<\/code> \u5c5e\u6027\uff08readonly Properties\uff09<\/h3>\n<p dir=\"auto\">\u5728 TypeScript \u4e2d\uff0c\u5c5e\u6027\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a <code class=\"notranslate\">readonly<\/code>\uff0c\u8fd9\u4e0d\u4f1a\u6539\u53d8\u4efb\u4f55\u8fd0\u884c\u65f6\u7684\u884c\u4e3a\uff0c\u4f46\u5728\u7c7b\u578b\u68c0\u67e5\u7684\u65f6\u5019\uff0c\u4e00\u4e2a\u6807\u8bb0\u4e3a <code class=\"notranslate\">readonly<\/code>\u7684\u5c5e\u6027\u662f\u4e0d\u80fd\u88ab\u5199\u5165\u7684\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface SomeType {\n  readonly prop: string;\n}\n \nfunction doSomething(obj: SomeType) {\n  \/\/ We can read from 'obj.prop'.\n  console.log(`prop has the value '${obj.prop}'.`);\n \n  \/\/ But we can't re-assign it.\n  obj.prop = &quot;hello&quot;;\n  \/\/ Cannot assign to 'prop' because it is a read-only property.\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">SomeType<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">readonly<\/span> <span class=\"pl-c1\">prop<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">doSomething<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">obj<\/span>: <span class=\"pl-smi\">SomeType<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ We can read from 'obj.prop'.<\/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\">`prop has the value '<span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prop<\/span><span class=\"pl-kos\">}<\/span><\/span>'.`<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c\">\/\/ But we can't re-assign it.<\/span>\n  <span class=\"pl-s1\">obj<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">prop<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Cannot assign to 'prop' because it is a read-only property.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e0d\u8fc7\u4f7f\u7528 <code class=\"notranslate\">readonly<\/code> \u5e76\u4e0d\u610f\u5473\u7740\u4e00\u4e2a\u503c\u5c31\u5b8c\u5168\u662f\u4e0d\u53d8\u7684\uff0c\u4ea6\u6216\u8005\u8bf4\uff0c\u5185\u90e8\u7684\u5185\u5bb9\u662f\u4e0d\u80fd\u53d8\u7684\u3002<code class=\"notranslate\">readonly<\/code> \u4ec5\u4ec5\u8868\u660e\u5c5e\u6027\u672c\u8eab\u662f\u4e0d\u80fd\u88ab\u91cd\u65b0\u5199\u5165\u7684\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Home {\n  readonly resident: { name: string; age: number };\n}\n \nfunction visitForBirthday(home: Home) {\n  \/\/ We can read and update properties from 'home.resident'.\n  console.log(`Happy birthday ${home.resident.name}!`);\n  home.resident.age++;\n}\n \nfunction evict(home: Home) {\n  \/\/ But we can't write to the 'resident' property itself on a 'Home'.\n  home.resident = {\n  \/\/ Cannot assign to 'resident' because it is a read-only property.\n    name: &quot;Victor the Evictor&quot;,\n    age: 42,\n  };\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Home<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">readonly<\/span> <span class=\"pl-c1\">resident<\/span>: <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c1\">age<\/span>: <span class=\"pl-smi\">number<\/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\">visitForBirthday<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">home<\/span>: <span class=\"pl-smi\">Home<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ We can read and update properties from 'home.resident'.<\/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\">`Happy birthday <span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">home<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">resident<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">name<\/span><span class=\"pl-kos\">}<\/span><\/span>!`<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-s1\">home<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">resident<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">age<\/span><span class=\"pl-c1\">++<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">evict<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">home<\/span>: <span class=\"pl-smi\">Home<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ But we can't write to the 'resident' property itself on a 'Home'.<\/span>\n  <span class=\"pl-s1\">home<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">resident<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ Cannot assign to 'resident' because it is a read-only property.<\/span>\n    <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">\"Victor the Evictor\"<\/span><span class=\"pl-kos\">,<\/span>\n    <span class=\"pl-c1\">age<\/span>: <span class=\"pl-c1\">42<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">TypeScript \u5728\u68c0\u67e5\u4e24\u4e2a\u7c7b\u578b\u662f\u5426\u517c\u5bb9\u7684\u65f6\u5019\uff0c\u5e76\u4e0d\u4f1a\u8003\u8651\u4e24\u4e2a\u7c7b\u578b\u91cc\u7684\u5c5e\u6027\u662f\u5426\u662f \t<code class=\"notranslate\">readonly<\/code>\uff0c\u8fd9\u5c31\u610f\u5473\u7740\uff0c<code class=\"notranslate\">readonly<\/code> \u7684\u503c\u662f\u53ef\u4ee5\u901a\u8fc7\u522b\u540d\u4fee\u6539\u7684\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Person {\n  name: string;\n  age: number;\n}\n \ninterface ReadonlyPerson {\n  readonly name: string;\n  readonly age: number;\n}\n \nlet writablePerson: Person = {\n  name: &quot;Person McPersonface&quot;,\n  age: 42,\n};\n \n\/\/ works\nlet readonlyPerson: ReadonlyPerson = writablePerson;\n \nconsole.log(readonlyPerson.age); \/\/ prints '42'\nwritablePerson.age++;\nconsole.log(readonlyPerson.age); \/\/ prints '43'\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Person<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">age<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">ReadonlyPerson<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">readonly<\/span> <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-k\">readonly<\/span> <span class=\"pl-c1\">age<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">writablePerson<\/span>: <span class=\"pl-smi\">Person<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-s\">\"Person McPersonface\"<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">age<\/span>: <span class=\"pl-c1\">42<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-c\">\/\/ works<\/span>\n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">readonlyPerson<\/span>: <span class=\"pl-smi\">ReadonlyPerson<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">writablePerson<\/span><span class=\"pl-kos\">;<\/span>\n \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\">readonlyPerson<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">age<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ prints '42'<\/span>\n<span class=\"pl-s1\">writablePerson<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">age<\/span><span class=\"pl-c1\">++<\/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\">readonlyPerson<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">age<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ prints '43'<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u7d22\u5f15\u7b7e\u540d\uff08Index Signatures\uff09<\/h3>\n<p dir=\"auto\">\u6709\u7684\u65f6\u5019\uff0c\u4f60\u4e0d\u80fd\u63d0\u524d\u77e5\u9053\u4e00\u4e2a\u7c7b\u578b\u91cc\u7684\u6240\u6709\u5c5e\u6027\u7684\u540d\u5b57\uff0c\u4f46\u662f\u4f60\u77e5\u9053\u8fd9\u4e9b\u503c\u7684\u7279\u5f81\u3002<\/p>\n<p dir=\"auto\">\u8fd9\u79cd\u60c5\u51b5\uff0c\u4f60\u5c31\u53ef\u4ee5\u7528\u4e00\u4e2a\u7d22\u5f15\u7b7e\u540d (index signature) \u6765\u63cf\u8ff0\u53ef\u80fd\u7684\u503c\u7684\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=\"interface StringArray {\n  [index: number]: string;\n}\n \nconst myArray: StringArray = getStringArray();\nconst secondItem = myArray[1]; \/\/ const secondItem: string\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">StringArray<\/span> <span class=\"pl-kos\">{<\/span>\n  <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-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">myArray<\/span>: <span class=\"pl-smi\">StringArray<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">getStringArray<\/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\">secondItem<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">myArray<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ const secondItem: string<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u6837\uff0c\u6211\u4eec\u5c31\u6709\u4e86\u4e00\u4e2a\u5177\u6709\u7d22\u5f15\u7b7e\u540d\u7684\u63a5\u53e3 <code class=\"notranslate\">StringArray<\/code>\uff0c\u8fd9\u4e2a\u7d22\u5f15\u7b7e\u540d\u8868\u793a\u5f53\u4e00\u4e2a <code class=\"notranslate\">StringArray<\/code> \u7c7b\u578b\u7684\u503c\u4f7f\u7528 <code class=\"notranslate\">number<\/code> \u7c7b\u578b\u7684\u503c\u8fdb\u884c\u7d22\u5f15\u7684\u65f6\u5019\uff0c\u4f1a\u8fd4\u56de\u4e00\u4e2a <code class=\"notranslate\">string<\/code>\u7c7b\u578b\u7684\u503c\u3002<\/p>\n<p dir=\"auto\">\u4e00\u4e2a\u7d22\u5f15\u7b7e\u540d\u7684\u5c5e\u6027\u7c7b\u578b\u5fc5\u987b\u662f <code class=\"notranslate\">string<\/code> \u6216\u8005\u662f <code class=\"notranslate\">number<\/code>\u3002<\/p>\n<p dir=\"auto\">\u867d\u7136 TypeScript \u53ef\u4ee5\u540c\u65f6\u652f\u6301 <code class=\"notranslate\">string<\/code> \u548c <code class=\"notranslate\">number<\/code> \u7c7b\u578b\uff0c\u4f46\u6570\u5b57\u7d22\u5f15\u7684\u8fd4\u56de\u7c7b\u578b\u4e00\u5b9a\u8981\u662f\u5b57\u7b26\u7d22\u5f15\u8fd4\u56de\u7c7b\u578b\u7684\u5b50\u7c7b\u578b\u3002\u8fd9\u662f\u56e0\u4e3a\u5f53\u4f7f\u7528\u4e00\u4e2a\u6570\u5b57\u8fdb\u884c\u7d22\u5f15\u7684\u65f6\u5019\uff0cJavaScript \u5b9e\u9645\u4e0a\u628a\u5b83\u8f6c\u6210\u4e86\u4e00\u4e2a\u5b57\u7b26\u4e32\u3002\u8fd9\u5c31\u610f\u5473\u7740\u4f7f\u7528\u6570\u5b57 100 \u8fdb\u884c\u7d22\u5f15\u8ddf\u4f7f\u7528\u5b57\u7b26\u4e32 100 \u7d22\u5f15\uff0c\u662f\u4e00\u6837\u7684\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Animal {\n  name: string;\n}\n \ninterface Dog extends Animal {\n  breed: string;\n}\n \n\/\/ Error: indexing with a numeric string might get you a completely separate type of Animal!\ninterface NotOkay {\n  [x: number]: Animal;\n  \/\/ 'number' index type 'Animal' is not assignable to 'string' index type 'Dog'.\n  [x: string]: Dog;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Animal<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Dog<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">Animal<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">breed<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ Error: indexing with a numeric string might get you a completely separate type of Animal!<\/span>\n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">NotOkay<\/span> <span class=\"pl-kos\">{<\/span>\n  <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\">Animal<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ 'number' index type 'Animal' is not assignable to 'string' index type 'Dog'.<\/span>\n  <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\">Dog<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5c3d\u7ba1\u5b57\u7b26\u4e32\u7d22\u5f15\u7528\u6765\u63cf\u8ff0\u5b57\u5178\u6a21\u5f0f\uff08dictionary pattern\uff09\u975e\u5e38\u7684\u6709\u6548\uff0c\u4f46\u4e5f\u4f1a\u5f3a\u5236\u8981\u6c42\u6240\u6709\u7684\u5c5e\u6027\u8981\u5339\u914d\u7d22\u5f15\u7b7e\u540d\u7684\u8fd4\u56de\u7c7b\u578b\u3002\u8fd9\u662f\u56e0\u4e3a\u4e00\u4e2a\u58f0\u660e\u7c7b\u4f3c\u4e8e <code class=\"notranslate\">obj.property<\/code> \u7684\u5b57\u7b26\u4e32\u7d22\u5f15\uff0c\u8ddf <code class=\"notranslate\">obj[\"property\"]<\/code>\u662f\u4e00\u6837\u7684\u3002\u5728\u4e0b\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c<code class=\"notranslate\">name<\/code> \u7684\u7c7b\u578b\u5e76\u4e0d\u5339\u914d\u5b57\u7b26\u4e32\u7d22\u5f15\u7684\u7c7b\u578b\uff0c\u6240\u4ee5\u7c7b\u578b\u68c0\u67e5\u5668\u4f1a\u7ed9\u51fa\u62a5\u9519\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface NumberDictionary {\n  [index: string]: number;\n \n  length: number; \/\/ ok\n  name: string;\n\t\/\/ Property 'name' of type 'string' is not assignable to 'string' index type 'number'.\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">NumberDictionary<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">index<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">]<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c1\">length<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ ok<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n\t<span class=\"pl-c\">\/\/ Property 'name' of type 'string' is not assignable to 'string' index type 'number'.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7136\u800c\uff0c\u5982\u679c\u4e00\u4e2a\u7d22\u5f15\u7b7e\u540d\u662f\u5c5e\u6027\u7c7b\u578b\u7684\u8054\u5408\uff0c\u90a3\u5404\u79cd\u7c7b\u578b\u7684\u5c5e\u6027\u5c31\u53ef\u4ee5\u63a5\u53d7\u4e86\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface NumberOrStringDictionary {\n  [index: string]: number | string;\n  length: number; \/\/ ok, length is a number\n  name: string; \/\/ ok, name is a string\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">NumberOrStringDictionary<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">index<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">]<\/span>: <span class=\"pl-smi\">number<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">length<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ ok, length is a number<\/span>\n  <span class=\"pl-c1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ ok, name is a string<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6700\u540e\uff0c\u4f60\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u7d22\u5f15\u7b7e\u540d\u4e3a <code class=\"notranslate\">readonly<\/code>\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface ReadonlyStringArray {\n  readonly [index: number]: string;\n}\n \nlet myArray: ReadonlyStringArray = getReadOnlyStringArray();\nmyArray[2] = &quot;Mallory&quot;;\n\/\/ Index signature in type 'ReadonlyStringArray' only permits reading.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">ReadonlyStringArray<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">readonly<\/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-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">myArray<\/span>: <span class=\"pl-smi\">ReadonlyStringArray<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-en\">getReadOnlyStringArray<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">myArray<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"Mallory\"<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Index signature in type 'ReadonlyStringArray' only permits reading.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u56e0\u4e3a\u7d22\u5f15\u7b7e\u540d\u662f <code class=\"notranslate\">readonly<\/code> \uff0c\u6240\u4ee5\u4f60\u65e0\u6cd5\u8bbe\u7f6e <code class=\"notranslate\">myArray[2]<\/code> \u7684\u503c\u3002<\/p>\n<h2 dir=\"auto\">\u5c5e\u6027\u7ee7\u627f\uff08Extending Types\uff09<\/h2>\n<p dir=\"auto\">\u6709\u65f6\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u6bd4\u5176\u4ed6\u7c7b\u578b\u66f4\u5177\u4f53\u7684\u7c7b\u578b\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a <code class=\"notranslate\">BasicAddress<\/code> \u7c7b\u578b\u7528\u6765\u63cf\u8ff0\u5728\u7f8e\u56fd\u90ae\u5bc4\u4fe1\u4ef6\u548c\u5305\u88f9\u7684\u6240\u9700\u5b57\u6bb5\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface BasicAddress {\n  name?: string;\n  street: string;\n  city: string;\n  country: string;\n  postalCode: string;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">BasicAddress<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>?: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">street<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">city<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">country<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">postalCode<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u5df2\u7ecf\u6ee1\u8db3\u4e86\uff0c\u4f46\u540c\u4e00\u4e2a\u5730\u5740\u7684\u5efa\u7b51\u5f80\u5f80\u8fd8\u6709\u4e0d\u540c\u7684\u5355\u5143\u53f7\uff0c\u6211\u4eec\u53ef\u4ee5\u518d\u5199\u4e00\u4e2a <code class=\"notranslate\">AddressWithUnit<\/code>\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface AddressWithUnit {\n  name?: string;\n  unit: string;\n  street: string;\n  city: string;\n  country: string;\n  postalCode: string;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">AddressWithUnit<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>?: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">unit<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">street<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">city<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">country<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">postalCode<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u6837\u5199\u56fa\u7136\u53ef\u4ee5\uff0c\u4f46\u4e3a\u4e86\u52a0\u4e00\u4e2a\u5b57\u6bb5\uff0c\u5c31\u662f\u8981\u5b8c\u5168\u7684\u62f7\u8d1d\u4e00\u904d\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u53ef\u4ee5\u6539\u6210\u7ee7\u627f <code class=\"notranslate\">BasicAddress<\/code>\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface BasicAddress {\n  name?: string;\n  street: string;\n  city: string;\n  country: string;\n  postalCode: string;\n}\n \ninterface AddressWithUnit extends BasicAddress {\n  unit: string;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">BasicAddress<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">name<\/span>?: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">street<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">city<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">country<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">postalCode<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">AddressWithUnit<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">BasicAddress<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">unit<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5bf9\u63a5\u53e3\u4f7f\u7528 <code class=\"notranslate\">extends<\/code>\u5173\u952e\u5b57\u5141\u8bb8\u6211\u4eec\u6709\u6548\u7684\u4ece\u5176\u4ed6\u58f0\u660e\u8fc7\u7684\u7c7b\u578b\u4e2d\u62f7\u8d1d\u6210\u5458\uff0c\u5e76\u4e14\u968f\u610f\u6dfb\u52a0\u65b0\u6210\u5458\u3002<\/p>\n<p dir=\"auto\">\u63a5\u53e3\u4e5f\u53ef\u4ee5\u7ee7\u627f\u591a\u4e2a\u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='interface Colorful {\n  color: string;\n}\n \ninterface Circle {\n  radius: number;\n}\n \ninterface ColorfulCircle extends Colorful, Circle {}\n \nconst cc: ColorfulCircle = {\n  color: \"red\",\n  radius: 42,\n};'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Circle<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">radius<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">ColorfulCircle<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">Colorful<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">Circle<\/span> <span class=\"pl-kos\">{<\/span><span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">cc<\/span>: <span class=\"pl-smi\">ColorfulCircle<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-s\">\"red\"<\/span><span class=\"pl-kos\">,<\/span>\n  <span class=\"pl-c1\">radius<\/span>: <span class=\"pl-c1\">42<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u4ea4\u53c9\u7c7b\u578b\uff08Intersection Types\uff09<\/h2>\n<p dir=\"auto\">TypeScript \u4e5f\u63d0\u4f9b\u4e86\u540d\u4e3a\u4ea4\u53c9\u7c7b\u578b\uff08Intersection types\uff09\u7684\u65b9\u6cd5\uff0c\u7528\u4e8e\u5408\u5e76\u5df2\u7ecf\u5b58\u5728\u7684\u5bf9\u8c61\u7c7b\u578b\u3002<\/p>\n<p dir=\"auto\">\u4ea4\u53c9\u7c7b\u578b\u7684\u5b9a\u4e49\u9700\u8981\u7528\u5230 <code class=\"notranslate\">&amp;<\/code> \u64cd\u4f5c\u7b26\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Colorful {\n  color: string;\n}\ninterface Circle {\n  radius: number;\n}\n \ntype ColorfulCircle = Colorful &amp; Circle;\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Circle<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">radius<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">ColorfulCircle<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-c1\">&amp;<\/span> <span class=\"pl-smi\">Circle<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u91cc\uff0c\u6211\u4eec\u8fde\u7ed3 <code class=\"notranslate\">Colorful<\/code> \u548c <code class=\"notranslate\">Circle<\/code> \u4ea7\u751f\u4e86\u4e00\u4e2a\u65b0\u7684\u7c7b\u578b\uff0c\u65b0\u7c7b\u578b\u62e5\u6709 <code class=\"notranslate\">Colorful<\/code> \u548c <code class=\"notranslate\">Circle<\/code> \u7684\u6240\u6709\u6210\u5458\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function draw(circle: Colorful &amp; Circle) {\n  console.log(`Color was ${circle.color}`);\n  console.log(`Radius was ${circle.radius}`);\n}\n \n\/\/ okay\ndraw({ color: &quot;blue&quot;, radius: 42 });\n \n\/\/ oops\ndraw({ color: &quot;red&quot;, raidus: 42 });\n\/\/ Argument of type '{ color: string; raidus: number; }' is not assignable to parameter of type 'Colorful &amp; Circle'.\n\/\/ Object literal may only specify known properties, but 'raidus' does not exist in type 'Colorful &amp; Circle'. Did you mean to write 'radius'?\n\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">draw<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">circle<\/span>: <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-c1\">&amp;<\/span> <span class=\"pl-smi\">Circle<\/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\">`Color was <span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">circle<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">color<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/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\">`Radius was <span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">circle<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">radius<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ okay<\/span>\n<span class=\"pl-en\">draw<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">color<\/span>: <span class=\"pl-s\">\"blue\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">radius<\/span>: <span class=\"pl-c1\">42<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-c\">\/\/ oops<\/span>\n<span class=\"pl-en\">draw<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">color<\/span>: <span class=\"pl-s\">\"red\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">raidus<\/span>: <span class=\"pl-c1\">42<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ Argument of type '{ color: string; raidus: number; }' is not assignable to parameter of type 'Colorful &amp; Circle'.<\/span>\n<span class=\"pl-c\">\/\/ Object literal may only specify known properties, but 'raidus' does not exist in type 'Colorful &amp; Circle'. Did you mean to write 'radius'?<\/span><\/pre>\n<\/div>\n<h2 dir=\"auto\">\u63a5\u53e3\u7ee7\u627f\u4e0e\u4ea4\u53c9\u7c7b\u578b\uff08Interfalces vs Intersections\uff09<\/h2>\n<p dir=\"auto\">\u8fd9\u4e24\u79cd\u65b9\u5f0f\u5728\u5408\u5e76\u7c7b\u578b\u4e0a\u770b\u8d77\u6765\u5f88\u76f8\u4f3c\uff0c\u4f46\u5b9e\u9645\u4e0a\u8fd8\u662f\u6709\u5f88\u5927\u7684\u4e0d\u540c\u3002\u6700\u539f\u5219\u6027\u7684\u4e0d\u540c\u5c31\u662f\u5728\u4e8e\u51b2\u7a81\u600e\u4e48\u5904\u7406\uff0c\u8fd9\u4e5f\u662f\u4f60\u51b3\u5b9a\u9009\u62e9\u90a3\u79cd\u65b9\u5f0f\u7684\u4e3b\u8981\u539f\u56e0\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Colorful {\n  color: string;\n}\n\ninterface ColorfulSub extends Colorful {\n  color: number\n}\n\n\/\/ Interface 'ColorfulSub' incorrectly extends interface 'Colorful'.\n\/\/ Types of property 'color' are incompatible.\n\/\/ Type 'number' is not assignable to type 'string'.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">ColorfulSub<\/span> <span class=\"pl-k\">extends<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-smi\">number<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-c\">\/\/ Interface 'ColorfulSub' incorrectly extends interface 'Colorful'.<\/span>\n<span class=\"pl-c\">\/\/ Types of property 'color' are incompatible.<\/span>\n<span class=\"pl-c\">\/\/ Type 'number' is not assignable to type 'string'.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f7f\u7528\u7ee7\u627f\u7684\u65b9\u5f0f\uff0c\u5982\u679c\u91cd\u5199\u7c7b\u578b\u4f1a\u5bfc\u81f4\u7f16\u8bd1\u9519\u8bef\uff0c\u4f46\u4ea4\u53c9\u7c7b\u578b\u4e0d\u4f1a\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Colorful {\n  color: string;\n}\n\ntype ColorfulSub = Colorful &amp; {\n  color: number\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">ColorfulSub<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Colorful<\/span> <span class=\"pl-c1\">&amp;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">color<\/span>: <span class=\"pl-smi\">number<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u867d\u7136\u4e0d\u4f1a\u62a5\u9519\uff0c\u90a3 <code class=\"notranslate\">color<\/code> \u5c5e\u6027\u7684\u7c7b\u578b\u662f\u4ec0\u4e48\u5462\uff0c\u7b54\u6848\u662f <code class=\"notranslate\">never<\/code>\uff0c\u53d6\u5f97\u662f <code class=\"notranslate\">string<\/code> \u548c <code class=\"notranslate\">number<\/code> \u7684\u4ea4\u96c6\u3002<\/p>\n<h2 dir=\"auto\">\u6cdb\u578b\u5bf9\u8c61\u7c7b\u578b\uff08Generic Object Types\uff09<\/h2>\n<p dir=\"auto\">\u8ba9\u6211\u4eec\u5199\u8fd9\u6837\u4e00\u4e2a <code class=\"notranslate\">Box<\/code> \u7c7b\u578b\uff0c\u53ef\u4ee5\u5305\u542b\u4efb\u4f55\u503c\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Box {\n  contents: any;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Box<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u73b0\u5728 <code class=\"notranslate\">content<\/code> \u5c5e\u6027\u7684\u7c7b\u578b\u4e3a <code class=\"notranslate\">any<\/code>\uff0c\u53ef\u4ee5\u7528\uff0c\u4f46\u5bb9\u6613\u5bfc\u81f4\u7ffb\u8f66\u3002<\/p>\n<p dir=\"auto\">\u6211\u4eec\u4e5f\u53ef\u4ee5\u4ee3\u66ff\u4f7f\u7528 <code class=\"notranslate\">unknown<\/code>\uff0c\u4f46\u8fd9\u4e5f\u610f\u5473\u7740\uff0c\u5982\u679c\u6211\u4eec\u5df2\u7ecf\u77e5\u9053\u4e86 <code class=\"notranslate\">contents<\/code> \u7684\u7c7b\u578b\uff0c\u6211\u4eec\u9700\u8981\u505a\u4e00\u4e9b\u9884\u9632\u68c0\u67e5\uff0c\u6216\u8005\u7528\u4e00\u4e2a\u5bb9\u6613\u9519\u8bef\u7684\u7c7b\u578b\u65ad\u8a00\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Box {\n  contents: unknown;\n}\n \nlet x: Box = {\n  contents: &quot;hello world&quot;,\n};\n \n\/\/ we could check 'x.contents'\nif (typeof x.contents === &quot;string&quot;) {\n  console.log(x.contents.toLowerCase());\n}\n \n\/\/ or we could use a type assertion\nconsole.log((x.contents as string).toLowerCase());\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Box<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">unknown<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">x<\/span>: <span class=\"pl-smi\">Box<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-s\">\"hello world\"<\/span><span class=\"pl-kos\">,<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-c\">\/\/ we could check 'x.contents'<\/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-kos\">.<\/span><span class=\"pl-c1\">contents<\/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-smi\">console<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">log<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contents<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toLowerCase<\/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-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ or we could use a type assertion<\/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-kos\">(<\/span><span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contents<\/span> <span class=\"pl-k\">as<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">toLowerCase<\/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<p dir=\"auto\">\u4e00\u4e2a\u66f4\u52a0\u5b89\u5168\u7684\u505a\u6cd5\u662f\u5c06 <code class=\"notranslate\">Box<\/code> \u6839\u636e <code class=\"notranslate\">contents<\/code> \u7684\u7c7b\u578b\u62c6\u5206\u7684\u66f4\u5177\u4f53\u4e00\u4e9b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface NumberBox {\n  contents: number;\n}\n \ninterface StringBox {\n  contents: string;\n}\n \ninterface BooleanBox {\n  contents: boolean;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">NumberBox<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">StringBox<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">BooleanBox<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f46\u662f\u8fd9\u4e5f\u610f\u5473\u7740\u6211\u4eec\u4e0d\u5f97\u4e0d\u521b\u5efa\u4e0d\u540c\u7684\u51fd\u6570\u6216\u8005\u51fd\u6570\u91cd\u8f7d\u5904\u7406\u4e0d\u540c\u7684\u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function setContents(box: StringBox, newContents: string): void;\nfunction setContents(box: NumberBox, newContents: number): void;\nfunction setContents(box: BooleanBox, newContents: boolean): void;\nfunction setContents(box: { contents: any }, newContents: any) {\n  box.contents = newContents;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-s1\">setContents<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">box<\/span>: <span class=\"pl-smi\">StringBox<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">newContents<\/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-s1\">setContents<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">box<\/span>: <span class=\"pl-smi\">NumberBox<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">newContents<\/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-k\">function<\/span> <span class=\"pl-s1\">setContents<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">box<\/span>: <span class=\"pl-smi\">BooleanBox<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">newContents<\/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-k\">function<\/span> <span class=\"pl-en\">setContents<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">box<\/span>: <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">any<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">newContents<\/span>: <span class=\"pl-smi\">any<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-s1\">box<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contents<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">newContents<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u6837\u5199\u5c31\u592a\u7e41\u7410\u4e86\u3002<\/p>\n<p dir=\"auto\">\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u521b\u5efa\u4e00\u4e2a\u6cdb\u578b <code class=\"notranslate\">Box<\/code> \uff0c\u5b83\u58f0\u660e\u4e86\u4e00\u4e2a\u7c7b\u578b\u53c2\u6570 (type parameter)\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Box&lt;Type&gt; {\n  contents: Type;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f60\u53ef\u4ee5\u8fd9\u6837\u7406\u89e3\uff1a<code class=\"notranslate\">Box<\/code> \u7684 <code class=\"notranslate\">Type<\/code> \u5c31\u662f <code class=\"notranslate\">contents<\/code> \u62e5\u6709\u7684\u7c7b\u578b <code class=\"notranslate\">Type<\/code>\u3002<\/p>\n<p dir=\"auto\">\u5f53\u6211\u4eec\u5f15\u7528 <code class=\"notranslate\">Box<\/code> \u7684\u65f6\u5019\uff0c\u6211\u4eec\u9700\u8981\u7ed9\u4e88\u4e00\u4e2a\u7c7b\u578b\u5b9e\u53c2\u66ff\u6362\u6389 <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=\"let box: Box&lt;string&gt;;\">\n<pre class=\"notranslate\"><span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">box<\/span>: <span class=\"pl-smi\">Box<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u628a <code class=\"notranslate\">Box<\/code> \u60f3\u8c61\u6210\u4e00\u4e2a\u5b9e\u9645\u7c7b\u578b\u7684\u6a21\u677f\uff0c<code class=\"notranslate\">Type<\/code> \u5c31\u662f\u4e00\u4e2a\u5360\u4f4d\u7b26\uff0c\u53ef\u4ee5\u88ab\u66ff\u4ee3\u4e3a\u5177\u4f53\u7684\u7c7b\u578b\u3002\u5f53 TypeScript \u770b\u5230 <code class=\"notranslate\">Box&lt;string&gt;<\/code>\uff0c\u5b83\u5c31\u4f1a\u66ff\u6362\u4e3a <code class=\"notranslate\">Box&lt;Type&gt;<\/code> \u7684 <code class=\"notranslate\">Type<\/code> \u4e3a <code class=\"notranslate\">string<\/code> \uff0c\u6700\u540e\u7684\u7ed3\u679c\u5c31\u4f1a\u53d8\u6210 <code class=\"notranslate\">{ contents: string }<\/code>\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c<code class=\"notranslate\">Box&lt;string&gt;<\/code>\u548c <code class=\"notranslate\">StringBox<\/code> \u662f\u4e00\u6837\u7684\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='\ninterface Box&lt;Type&gt; {\n  contents: Type;\n}\ninterface StringBox {\n  contents: string;\n}\n \nlet boxA: Box&lt;string&gt; = { contents: \"hello\" };\nboxA.contents;        \n\/\/ (property) Box&lt;string&gt;.contents: string\n \nlet boxB: StringBox = { contents: \"world\" };\nboxB.contents;     \n\/\/ (property) StringBox.contents: string'><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">StringBox<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">boxA<\/span>: <span class=\"pl-smi\">Box<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-s\">\"hello\"<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">boxA<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contents<\/span><span class=\"pl-kos\">;<\/span>        \n<span class=\"pl-c\">\/\/ (property) Box&lt;string&gt;.contents: string<\/span>\n \n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">boxB<\/span>: <span class=\"pl-smi\">StringBox<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span> <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-s\">\"world\"<\/span> <span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-s1\">boxB<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contents<\/span><span class=\"pl-kos\">;<\/span>     \n<span class=\"pl-c\">\/\/ (property) StringBox.contents: string<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4e0d\u8fc7\u73b0\u5728\u7684 <code class=\"notranslate\">Box<\/code>  \u662f\u53ef\u91cd\u590d\u4f7f\u7528\u7684\uff0c\u5982\u679c\u6211\u4eec\u9700\u8981\u4e00\u4e2a\u65b0\u7684\u7c7b\u578b\uff0c\u6211\u4eec\u5b8c\u5168\u4e0d\u9700\u8981\u518d\u91cd\u65b0\u58f0\u660e\u4e00\u4e2a\u7c7b\u578b\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Box&lt;Type&gt; {\n  contents: Type;\n}\n \ninterface Apple {\n  \/\/ ....\n}\n \n\/\/ Same as '{ contents: Apple }'.\ntype AppleBox = Box&lt;Apple&gt;;\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Apple<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ....<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-c\">\/\/ Same as '{ contents: Apple }'.<\/span>\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">AppleBox<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">Apple<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u4e5f\u610f\u5473\u7740\u6211\u4eec\u53ef\u4ee5\u5229\u7528\u6cdb\u578b\u51fd\u6570\u907f\u514d\u4f7f\u7528\u51fd\u6570\u91cd\u8f7d\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function setContents&lt;Type&gt;(box: Box&lt;Type&gt;, newContents: Type) {\n  box.contents = newContents;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">setContents<\/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\">box<\/span>: <span class=\"pl-smi\">Box<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">newContents<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-s1\">box<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">contents<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">newContents<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7c7b\u578b\u522b\u540d\u4e5f\u662f\u53ef\u4ee5\u4f7f\u7528\u6cdb\u578b\u7684\u3002\u6bd4\u5982\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Box&lt;Type&gt; {\n  contents: Type;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u4f7f\u7528\u522b\u540d\u5bf9\u5e94\u5c31\u662f\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type Box&lt;Type&gt; = {\n  contents: Type;\n};\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Box<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c1\">contents<\/span>: <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7c7b\u578b\u522b\u540d\u4e0d\u540c\u4e8e\u63a5\u53e3\uff0c\u53ef\u4ee5\u63cf\u8ff0\u7684\u4e0d\u6b62\u662f\u5bf9\u8c61\u7c7b\u578b\uff0c\u6240\u4ee5\u6211\u4eec\u4e5f\u53ef\u4ee5\u7528\u7c7b\u578b\u522b\u540d\u5199\u4e00\u4e9b\u5176\u4ed6\u79cd\u7c7b\u7684\u7684\u6cdb\u578b\u5e2e\u52a9\u7c7b\u578b\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type OrNull&lt;Type&gt; = Type | null;\n \ntype OneOrMany&lt;Type&gt; = Type | Type[];\n \ntype OneOrManyOrNull&lt;Type&gt; = OrNull&lt;OneOrMany&lt;Type&gt;&gt;;\n           \ntype OneOrManyOrNull&lt;Type&gt; = OneOrMany&lt;Type&gt; | null\n \ntype OneOrManyOrNullStrings = OneOrManyOrNull&lt;string&gt;;\n               \ntype OneOrManyOrNullStrings = OneOrMany&lt;string&gt; | null\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">OrNull<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Type<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-c1\">null<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">OneOrMany<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">Type<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">OneOrManyOrNull<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">OrNull<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">OneOrMany<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">;<\/span>\n           \n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">OneOrManyOrNull<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">OneOrMany<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-kos\">&gt;<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-c1\">null<\/span>\n \n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">OneOrManyOrNullStrings<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">OneOrManyOrNull<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">;<\/span>\n               \n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">OneOrManyOrNullStrings<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-smi\">OneOrMany<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span> <span class=\"pl-c1\">|<\/span> <span class=\"pl-c1\">null<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\"><code class=\"notranslate\">Array<\/code> \u7c7b\u578b\uff08The Array Type\uff09<\/h3>\n<p dir=\"auto\">\u6211\u4eec\u4e4b\u524d\u8bb2\u8fc7 <code class=\"notranslate\">Array<\/code> \u7c7b\u578b\uff0c\u5f53\u6211\u4eec\u8fd9\u6837\u5199\u7c7b\u578b <code class=\"notranslate\">number[]<\/code> \u6216\u8005 <code class=\"notranslate\">string[]<\/code> \u7684\u65f6\u5019\uff0c\u5176\u5b9e\u5b83\u4eec\u53ea\u662f <code class=\"notranslate\">Array&lt;number&gt;<\/code> \u548c <code class=\"notranslate\">Array&lt;string&gt;<\/code>  \u7684\u7b80\u5199\u5f62\u5f0f\u800c\u5df2\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function doSomething(value: Array&lt;string&gt;) {\n  \/\/ ...\n}\n \nlet myArray: string[] = [\"hello\", \"world\"];\n \n\/\/ either of these work!\ndoSomething(myArray);\ndoSomething(new Array(\"hello\", \"world\"));'><\/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\">value<\/span>: <span class=\"pl-smi\">Array<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">myArray<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-c\">\/\/ either of these work!<\/span>\n<span class=\"pl-en\">doSomething<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">myArray<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-en\">doSomething<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-k\">new<\/span> <span class=\"pl-smi\">Array<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7c7b\u4f3c\u4e8e\u4e0a\u9762\u7684 <code class=\"notranslate\">Box<\/code> \u7c7b\u578b\uff0c<code class=\"notranslate\">Array<\/code> \u672c\u8eab\u5c31\u662f\u4e00\u4e2a\u6cdb\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface Array&lt;Type&gt; {\n  \/**\n   * Gets or sets the length of the array.\n   *\/\n  length: number;\n \n  \/**\n   * Removes the last element from an array and returns it.\n   *\/\n  pop(): Type | undefined;\n \n  \/**\n   * Appends new elements to an array, and returns the new length of the array.\n   *\/\n  push(...items: Type[]): number;\n \n  \/\/ ...\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">Array<\/span><span class=\"pl-c1\">&lt;<\/span><span class=\"pl-smi\">Type<\/span><span class=\"pl-c1\">&gt;<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/**<\/span>\n<span class=\"pl-c\">   * Gets or sets the length of the array.<\/span>\n<span class=\"pl-c\">   *\/<\/span>\n  <span class=\"pl-c1\">length<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c\">\/**<\/span>\n<span class=\"pl-c\">   * Removes the last element from an array and returns it.<\/span>\n<span class=\"pl-c\">   *\/<\/span>\n  <span class=\"pl-c1\">pop<\/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 \n  <span class=\"pl-c\">\/**<\/span>\n<span class=\"pl-c\">   * Appends new elements to an array, and returns the new length of the array.<\/span>\n<span class=\"pl-c\">   *\/<\/span>\n  <span class=\"pl-c1\">push<\/span><span class=\"pl-kos\">(<\/span>...<span class=\"pl-s1\">items<\/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\">number<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u73b0\u4ee3 JavaScript \u4e5f\u63d0\u4f9b\u5176\u4ed6\u662f\u6cdb\u578b\u7684\u6570\u636e\u7ed3\u6784\uff0c\u6bd4\u5982 <code class=\"notranslate\">Map&lt;K, V&gt;<\/code> \uff0c <code class=\"notranslate\">Set&lt;T&gt;<\/code> \u548c <code class=\"notranslate\">Promise&lt;T&gt;<\/code>\u3002\u56e0\u4e3a <code class=\"notranslate\">Map<\/code> \u3001<code class=\"notranslate\">Set<\/code> \u3001<code class=\"notranslate\">Promise<\/code>\u7684\u884c\u4e3a\u8868\u73b0\uff0c\u5b83\u4eec\u53ef\u4ee5\u8ddf\u4efb\u4f55\u7c7b\u578b\u642d\u914d\u4f7f\u7528\u3002<\/p>\n<h3 dir=\"auto\"><code class=\"notranslate\">ReadonlyArray<\/code> \u7c7b\u578b\uff08The ReadonlyArray Type\uff09<\/h3>\n<p dir=\"auto\"><code class=\"notranslate\">ReadonlyArray<\/code> \u662f\u4e00\u4e2a\u7279\u6b8a\u7c7b\u578b\uff0c\u5b83\u53ef\u4ee5\u63cf\u8ff0\u6570\u7ec4\u4e0d\u80fd\u88ab\u6539\u53d8\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doStuff(values: ReadonlyArray&lt;string&gt;) {\n  \/\/ We can read from 'values'...\n  const copy = values.slice();\n  console.log(`The first value is ${values[0]}`);\n \n  \/\/ ...but we can't mutate 'values'.\n  values.push(&quot;hello!&quot;);\n  \/\/ Property 'push' does not exist on type 'readonly string[]'.\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">doStuff<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">values<\/span>: <span class=\"pl-smi\">ReadonlyArray<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ We can read from 'values'...<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">copy<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">values<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">slice<\/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-s\">`The first value is <span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">values<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c\">\/\/ ...but we can't mutate 'values'.<\/span>\n  <span class=\"pl-s1\">values<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">push<\/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-c\">\/\/ Property 'push' does not exist on type 'readonly string[]'.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\"><code class=\"notranslate\">ReadonlyArray<\/code> \u4e3b\u8981\u662f\u7528\u6765\u505a\u610f\u56fe\u58f0\u660e\u3002\u5f53\u6211\u4eec\u770b\u5230\u4e00\u4e2a\u51fd\u6570\u8fd4\u56de <code class=\"notranslate\">ReadonlyArray<\/code>\uff0c\u5c31\u662f\u5728\u544a\u8bc9\u6211\u4eec\u4e0d\u80fd\u53bb\u66f4\u6539\u5176\u4e2d\u7684\u5185\u5bb9\uff0c\u5f53\u6211\u4eec\u770b\u5230\u4e00\u4e2a\u51fd\u6570\u652f\u6301\u4f20\u5165 <code class=\"notranslate\">ReadonlyArray<\/code> \uff0c\u8fd9\u662f\u5728\u544a\u8bc9\u6211\u4eec\u6211\u4eec\u53ef\u4ee5\u653e\u5fc3\u7684\u4f20\u5165\u6570\u7ec4\u5230\u51fd\u6570\u4e2d\uff0c\u800c\u4e0d\u7528\u62c5\u5fc3\u4f1a\u6539\u53d8\u6570\u7ec4\u7684\u5185\u5bb9\u3002<br \/>\n\u200b<br \/>\n\u4e0d\u50cf <code class=\"notranslate\">Array<\/code>\uff0c<code class=\"notranslate\">ReadonlyArray<\/code> \u5e76\u4e0d\u662f\u4e00\u4e2a\u6211\u4eec\u53ef\u4ee5\u7528\u7684\u6784\u9020\u5668\u51fd\u6570\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"new ReadonlyArray(&quot;red&quot;, &quot;green&quot;, &quot;blue&quot;);\n\/\/ 'ReadonlyArray' only refers to a type, but is being used as a value here.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">new<\/span> <span class=\"pl-smi\">ReadonlyArray<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s\">\"red\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"green\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"blue\"<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-c\">\/\/ 'ReadonlyArray' only refers to a type, but is being used as a value here.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u7136\u800c\uff0c\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u628a\u4e00\u4e2a\u5e38\u89c4\u6570\u7ec4\u8d4b\u503c\u7ed9 <code class=\"notranslate\">ReadonlyArray<\/code>\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='const roArray: ReadonlyArray&lt;string&gt; = [\"red\", \"green\", \"blue\"];'>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">roArray<\/span>: <span class=\"pl-smi\">ReadonlyArray<\/span><span class=\"pl-kos\">&lt;<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">&gt;<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"red\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"green\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s\">\"blue\"<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">TypeScript \u4e5f\u9488\u5bf9 <code class=\"notranslate\">ReadonlyArray&lt;Type&gt;<\/code> \u63d0\u4f9b\u4e86\u66f4\u7b80\u77ed\u7684\u5199\u6cd5 <code class=\"notranslate\">readonly Type[]<\/code>\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doStuff(values: readonly string[]) {\n  \/\/ We can read from 'values'...\n  const copy = values.slice();\n  console.log(`The first value is ${values[0]}`);\n \n  \/\/ ...but we can't mutate 'values'.\n  values.push(&quot;hello!&quot;);\n  \/\/ Property 'push' does not exist on type 'readonly string[]'.\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">doStuff<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">values<\/span>: <span class=\"pl-k\">readonly<\/span> <span class=\"pl-smi\">string<\/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\">\/\/ We can read from 'values'...<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">copy<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">values<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">slice<\/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-s\">`The first value is <span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">values<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">}<\/span><\/span>`<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c\">\/\/ ...but we can't mutate 'values'.<\/span>\n  <span class=\"pl-s1\">values<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">push<\/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-c\">\/\/ Property 'push' does not exist on type 'readonly string[]'.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6700\u540e\u6709\u4e00\u70b9\u8981\u6ce8\u610f\uff0c\u5c31\u662f <code class=\"notranslate\">Arrays<\/code> \u548c <code class=\"notranslate\">ReadonlyArray<\/code> \u5e76\u4e0d\u80fd\u53cc\u5411\u7684\u8d4b\u503c\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let x: readonly string[] = [];\nlet y: string[] = [];\n \nx = y; \/\/ ok\ny = x; \/\/ The type 'readonly string[]' is 'readonly' and cannot be assigned to the mutable type 'string[]'.\n\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">x<\/span>: <span class=\"pl-k\">readonly<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">y<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-s1\">x<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">y<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ ok<\/span>\n<span class=\"pl-s1\">y<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ The type 'readonly string[]' is 'readonly' and cannot be assigned to the mutable type 'string[]'.<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\">\u5143\u7ec4\u7c7b\u578b\uff08Tuple Types\uff09<\/h3>\n<p dir=\"auto\">\u5143\u7ec4\u7c7b\u578b\u662f\u53e6\u5916\u4e00\u79cd <code class=\"notranslate\">Array<\/code> \u7c7b\u578b\uff0c\u5f53\u4f60\u660e\u786e\u77e5\u9053\u6570\u7ec4\u5305\u542b\u591a\u5c11\u4e2a\u5143\u7d20\uff0c\u5e76\u4e14\u6bcf\u4e2a\u4f4d\u7f6e\u5143\u7d20\u7684\u7c7b\u578b\u90fd\u660e\u786e\u77e5\u9053\u7684\u65f6\u5019\uff0c\u5c31\u9002\u5408\u4f7f\u7528\u5143\u7ec4\u7c7b\u578b\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type StringNumberPair = [string, number];\">\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">StringNumberPair<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\uff0c<code class=\"notranslate\">StringNumberPair<\/code> \u5c31\u662f <code class=\"notranslate\">string<\/code> \u548c <code class=\"notranslate\">number<\/code> \u7684\u5143\u7ec4\u7c7b\u578b\u3002<\/p>\n<p dir=\"auto\">\u8ddf <code class=\"notranslate\">ReadonlyArray<\/code> \u4e00\u6837\uff0c\u5b83\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u4ea7\u751f\u5f71\u54cd\uff0c\u4f46\u662f\u5bf9 TypeScript \u5f88\u6709\u610f\u4e49\u3002\u56e0\u4e3a\u5bf9\u4e8e\u7c7b\u578b\u7cfb\u7edf\uff0c<code class=\"notranslate\">StringNumberPair<\/code> \u63cf\u8ff0\u4e86\u4e00\u4e2a\u6570\u7ec4\uff0c\u7d22\u5f15 0 \u7684\u503c\u7684\u7c7b\u578b\u662f <code class=\"notranslate\">string<\/code>\uff0c\u7d22\u5f15 1 \u7684\u503c\u7684\u7c7b\u578b\u662f <code class=\"notranslate\">number<\/code>\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content='function doSomething(pair: [string, number]) {\n  const a = pair[0];\n       \nconst a: string\n  const b = pair[1];\n       \nconst b: number\n  \/\/ ...\n}\n \ndoSomething([\"hello\", 42]);'><\/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\">pair<\/span>: <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/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-k\">const<\/span> <span class=\"pl-s1\">a<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">pair<\/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-k\">const<\/span> <span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">string<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">b<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">pair<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n       \n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">b<\/span>: <span class=\"pl-smi\">number<\/span>\n  <span class=\"pl-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-en\">doSomething<\/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-c1\">42<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5982\u679c\u8981\u83b7\u53d6\u5143\u7d20\u6570\u91cf\u4e4b\u5916\u7684\u5143\u7d20\uff0cTypeScript \u4f1a\u63d0\u793a\u9519\u8bef\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doSomething(pair: [string, number]) {\n  \/\/ ...\n \n  const c = pair[2];\n  \/\/ Tuple type '[string, number]' of length '2' has no element at index '2'.\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\">pair<\/span>: <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/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-c\">\/\/ ...<\/span>\n \n  <span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">c<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">pair<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Tuple type '[string, number]' of length '2' has no element at index '2'.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6211\u4eec\u4e5f\u53ef\u4ee5\u4f7f\u7528 JavaScript \u7684\u6570\u7ec4\u89e3\u6784\u8bed\u6cd5\u89e3\u6784\u5143\u7ec4\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doSomething(stringHash: [string, number]) {\n  const [inputString, hash] = stringHash;\n  console.log(inputString); \/\/ const inputString: string\n  console.log(hash); \/\/ const hash: number\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\">stringHash<\/span>: <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/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-k\">const<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">inputString<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">hash<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">stringHash<\/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\">inputString<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ const inputString: string<\/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\">hash<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ const hash: number<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<blockquote>\n<p dir=\"auto\">\u5143\u7ec4\u7c7b\u578b\u5728\u91cd\u5ea6\u4f9d\u8d56\u7ea6\u5b9a\u7684 API \u4e2d\u5f88\u6709\u7528\uff0c\u56e0\u4e3a\u5b83\u4f1a\u8ba9\u6bcf\u4e2a\u5143\u7d20\u7684\u610f\u4e49\u90fd\u5f88\u660e\u663e\u3002\u5f53\u6211\u4eec\u89e3\u6784\u7684\u65f6\u5019\uff0c\u5143\u7ec4\u7ed9\u4e86\u6211\u4eec\u547d\u540d\u53d8\u91cf\u7684\u81ea\u7531\u5ea6\u3002\u5728\u4e0a\u9762\u7684\u4f8b\u5b50\u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u547d\u540d\u5143\u7d20 <code class=\"notranslate\">0<\/code> \u548c <code class=\"notranslate\">1<\/code> \u4e3a\u6211\u4eec\u60f3\u8981\u7684\u540d\u5b57\u3002<\/p>\n<\/blockquote>\n<blockquote>\n<p dir=\"auto\">\u7136\u800c\uff0c\u4e5f\u4e0d\u662f\u6bcf\u4e2a\u7528\u6237\u90fd\u8fd9\u6837\u8ba4\u4e3a\uff0c\u6240\u4ee5\u6709\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u4e00\u4e2a\u5e26\u6709\u63cf\u8ff0\u5c5e\u6027\u540d\u5b57\u7684\u5bf9\u8c61\u4e5f\u8bb8\u662f\u4e2a\u66f4\u597d\u7684\u65b9\u5f0f\u3002<\/p>\n<\/blockquote>\n<p dir=\"auto\">\u9664\u4e86\u957f\u5ea6\u68c0\u67e5\uff0c\u7b80\u5355\u7684\u5143\u7ec4\u7c7b\u578b\u8ddf\u58f0\u660e\u4e86 <code class=\"notranslate\">length<\/code> \u5c5e\u6027\u548c\u5177\u4f53\u7684\u7d22\u5f15\u5c5e\u6027\u7684 <code class=\"notranslate\">Array<\/code> \u662f\u4e00\u6837\u7684\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"interface StringNumberPair {\n  \/\/ specialized properties\n  length: 2;\n  0: string;\n  1: number;\n \n  \/\/ Other 'Array&lt;string | number&gt;' members...\n  slice(start?: number, end?: number): Array&lt;string | number&gt;;\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">interface<\/span> <span class=\"pl-smi\">StringNumberPair<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-c\">\/\/ specialized properties<\/span>\n  <span class=\"pl-c1\">length<\/span>: <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">0<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c1\">1<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">;<\/span>\n \n  <span class=\"pl-c\">\/\/ Other 'Array&lt;string | number&gt;' members...<\/span>\n  <span class=\"pl-c1\">slice<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">start<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">end<\/span>?: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">)<\/span>: <span class=\"pl-smi\">Array<\/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>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u5143\u7ec4\u7c7b\u578b\u4e2d\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5199\u4e00\u4e2a\u53ef\u9009\u5c5e\u6027\uff0c\u4f46\u53ef\u9009\u5143\u7d20\u5fc5\u987b\u5728\u6700\u540e\u9762\uff0c\u800c\u4e14\u4e5f\u4f1a\u5f71\u54cd\u7c7b\u578b\u7684 <code class=\"notranslate\">length<\/code> \u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type Either2dOr3d = [number, number, number?];\n \nfunction setCoordinate(coord: Either2dOr3d) {\n  const [x, y, z] = coord;            \n   \/\/  const z: number | undefined\n \n  console.log(`Provided coordinates had ${coord.length} dimensions`);\n  \/\/ (property) length: 2 | 3\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">Either2dOr3d<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span>?<span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">setCoordinate<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">coord<\/span>: <span class=\"pl-smi\">Either2dOr3d<\/span><span class=\"pl-kos\">)<\/span> <span class=\"pl-kos\">{<\/span>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">x<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">y<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">z<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">coord<\/span><span class=\"pl-kos\">;<\/span>            \n   <span class=\"pl-c\">\/\/  const z: number | undefined<\/span>\n \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\">`Provided coordinates had <span class=\"pl-s1\"><span class=\"pl-kos\">${<\/span><span class=\"pl-s1\">coord<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">}<\/span><\/span> dimensions`<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ (property) length: 2 | 3<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">Tuples \u4e5f\u53ef\u4ee5\u4f7f\u7528\u5269\u4f59\u5143\u7d20\u8bed\u6cd5\uff0c\u4f46\u5fc5\u987b\u662f array\/tuple \u7c7b\u578b\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"type StringNumberBooleans = [string, number, ...boolean[]];\ntype StringBooleansNumber = [string, ...boolean[], number];\ntype BooleansStringNumber = [...boolean[], string, number];\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">StringNumberBooleans<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> ...<span class=\"pl-smi\">boolean<\/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\">type<\/span> <span class=\"pl-smi\">StringBooleansNumber<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> ...<span class=\"pl-smi\">boolean<\/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><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">BooleansStringNumber<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span>...<span class=\"pl-smi\">boolean<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u6709\u5269\u4f59\u5143\u7d20\u7684\u5143\u7ec4\u5e76\u4e0d\u4f1a\u8bbe\u7f6e <code class=\"notranslate\">length<\/code>\uff0c\u56e0\u4e3a\u5b83\u53ea\u77e5\u9053\u5728\u4e0d\u540c\u4f4d\u7f6e\u4e0a\u7684\u5df2\u77e5\u5143\u7d20\u4fe1\u606f\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"const a: StringNumberBooleans = [&quot;hello&quot;, 1];\nconst b: StringNumberBooleans = [&quot;beautiful&quot;, 2, true];\nconst c: StringNumberBooleans = [&quot;world&quot;, 3, true, false, true, false, true];\n\nconsole.log(a.length); \/\/ (property) length: number\n\ntype StringNumberPair = [string, number];\nconst d: StringNumberPair = ['1', 1];\nconsole.log(d.length); \/\/ (property) length: 2\n\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">a<\/span>: <span class=\"pl-smi\">StringNumberBooleans<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"hello\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">1<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">b<\/span>: <span class=\"pl-smi\">StringNumberBooleans<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"beautiful\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">c<\/span>: <span class=\"pl-smi\">StringNumberBooleans<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">\"world\"<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">3<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">false<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">false<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">true<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n\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-c1\">length<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ (property) length: number<\/span>\n\n<span class=\"pl-k\">type<\/span> <span class=\"pl-smi\">StringNumberPair<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">]<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-k\">const<\/span> <span class=\"pl-s1\">d<\/span>: <span class=\"pl-smi\">StringNumberPair<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s\">'1'<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-c1\">1<\/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\">d<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-c1\">length<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span> <span class=\"pl-c\">\/\/ (property) length: 2<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u53ef\u9009\u5143\u7d20\u548c\u5269\u4f59\u5143\u7d20\u7684\u5b58\u5728\uff0c\u4f7f\u5f97 TypeScript \u53ef\u4ee5\u5728\u53c2\u6570\u5217\u8868\u91cc\u4f7f\u7528\u5143\u7ec4\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function readButtonInput(...args: [string, number, ...boolean[]]) {\n  const [name, version, ...input] = args;\n  \/\/ ...\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">readButtonInput<\/span><span class=\"pl-kos\">(<\/span>...<span class=\"pl-s1\">args<\/span>: <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> ...<span class=\"pl-smi\">boolean<\/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>\n  <span class=\"pl-k\">const<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-s1\">name<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">version<\/span><span class=\"pl-kos\">,<\/span> ...<span class=\"pl-s1\">input<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s1\">args<\/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\">\u57fa\u672c\u7b49\u540c\u4e8e\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function readButtonInput(name: string, version: number, ...input: boolean[]) {\n  \/\/ ...\n}\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">function<\/span> <span class=\"pl-en\">readButtonInput<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">name<\/span>: <span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/span> <span class=\"pl-s1\">version<\/span>: <span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/span> ...<span class=\"pl-s1\">input<\/span>: <span class=\"pl-smi\">boolean<\/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\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<h3 dir=\"auto\"><code class=\"notranslate\">readonly<\/code> \u5143\u7ec4\u7c7b\u578b\uff08readonly Tuple Types\uff09<\/h3>\n<p dir=\"auto\">\u5143\u7ec4\u7c7b\u578b\u4e5f\u662f\u53ef\u4ee5\u8bbe\u7f6e <code class=\"notranslate\">readonly<\/code> \u7684\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doSomething(pair: readonly [string, number]) {\n  \/\/ ...\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\">pair<\/span>: <span class=\"pl-k\">readonly<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/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-c\">\/\/ ...<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u8fd9\u6837 TypeScript \u5c31\u4e0d\u4f1a\u5141\u8bb8\u5199\u5165<code class=\"notranslate\">readonly<\/code> \u5143\u7ec4\u7684\u4efb\u4f55\u5c5e\u6027\uff1a<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"function doSomething(pair: readonly [string, number]) {\n  pair[0] = &quot;hello!&quot;;\n  \/\/ Cannot assign to '0' because it is a read-only property.\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\">pair<\/span>: <span class=\"pl-k\">readonly<\/span> <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">string<\/span><span class=\"pl-kos\">,<\/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-s1\">pair<\/span><span class=\"pl-kos\">[<\/span><span class=\"pl-c1\">0<\/span><span class=\"pl-kos\">]<\/span> <span class=\"pl-c1\">=<\/span> <span class=\"pl-s\">\"hello!\"<\/span><span class=\"pl-kos\">;<\/span>\n  <span class=\"pl-c\">\/\/ Cannot assign to '0' because it is a read-only property.<\/span>\n<span class=\"pl-kos\">}<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5728\u5927\u90e8\u5206\u7684\u4ee3\u7801\u4e2d\uff0c\u5143\u7ec4\u53ea\u662f\u88ab\u521b\u5efa\uff0c\u4f7f\u7528\u5b8c\u540e\u4e5f\u4e0d\u4f1a\u88ab\u4fee\u6539\uff0c\u6240\u4ee5\u5c3d\u53ef\u80fd\u7684\u5c06\u5143\u7ec4\u8bbe\u7f6e\u4e3a <code class=\"notranslate\">readonly<\/code> \u662f\u4e00\u4e2a\u597d\u4e60\u60ef\u3002<\/p>\n<p dir=\"auto\">\u5982\u679c\u6211\u4eec\u7ed9\u4e00\u4e2a\u6570\u7ec4\u5b57\u9762\u91cf <code class=\"notranslate\">const<\/code> \u65ad\u8a00\uff0c\u4e5f\u4f1a\u88ab\u63a8\u65ad\u4e3a <code class=\"notranslate\">readonly<\/code> \u5143\u7ec4\u7c7b\u578b\u3002<\/p>\n<div class=\"highlight highlight-source-ts notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"let point = [3, 4] as const;\n \nfunction distanceFromOrigin([x, y]: [number, number]) {\n  return Math.sqrt(x ** 2 + y ** 2);\n}\n \ndistanceFromOrigin(point);\n\n\/\/ Argument of type 'readonly [3, 4]' is not assignable to parameter of type '[number, number]'.\n\/\/ The type 'readonly [3, 4]' is 'readonly' and cannot be assigned to the mutable type '[number, number]'.\"><\/p>\n<pre class=\"notranslate\"><span class=\"pl-k\">let<\/span> <span class=\"pl-s1\">point<\/span> <span class=\"pl-c1\">=<\/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-k\">as<\/span> <span class=\"pl-smi\">const<\/span><span class=\"pl-kos\">;<\/span>\n \n<span class=\"pl-k\">function<\/span> <span class=\"pl-en\">distanceFromOrigin<\/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-s1\">y<\/span><span class=\"pl-kos\">]<\/span>: <span class=\"pl-kos\">[<\/span><span class=\"pl-smi\">number<\/span><span class=\"pl-kos\">,<\/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-k\">return<\/span> <span class=\"pl-smi\">Math<\/span><span class=\"pl-kos\">.<\/span><span class=\"pl-en\">sqrt<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">x<\/span> <span class=\"pl-c1\">**<\/span> <span class=\"pl-c1\">2<\/span> <span class=\"pl-c1\">+<\/span> <span class=\"pl-s1\">y<\/span> <span class=\"pl-c1\">**<\/span> <span class=\"pl-c1\">2<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n<span class=\"pl-kos\">}<\/span>\n \n<span class=\"pl-en\">distanceFromOrigin<\/span><span class=\"pl-kos\">(<\/span><span class=\"pl-s1\">point<\/span><span class=\"pl-kos\">)<\/span><span class=\"pl-kos\">;<\/span>\n\n<span class=\"pl-c\">\/\/ Argument of type 'readonly [3, 4]' is not assignable to parameter of type '[number, number]'.<\/span>\n<span class=\"pl-c\">\/\/ The type 'readonly [3, 4]' is 'readonly' and cannot be assigned to the mutable type '[number, number]'.<\/span><\/pre>\n<\/div>\n<p dir=\"auto\">\u5c3d\u7ba1 <code class=\"notranslate\">distanceFromOrigin<\/code> \u5e76\u6ca1\u6709\u66f4\u6539\u4f20\u5165\u7684\u5143\u7d20\uff0c\u4f46\u51fd\u6570\u5e0c\u671b\u4f20\u5165\u4e00\u4e2a\u53ef\u53d8\u5143\u7ec4\u3002\u56e0\u4e3a <code class=\"notranslate\">point<\/code> \u7684\u7c7b\u578b\u88ab\u63a8\u65ad\u4e3a <code class=\"notranslate\">readonly [3, 4]<\/code>\uff0c\u5b83\u8ddf <code class=\"notranslate\">[number number]<\/code> \u5e76\u4e0d\u517c\u5bb9\uff0c\u6240\u4ee5 TypeScript \u7ed9\u4e86\u4e00\u4e2a\u62a5\u9519\u3002<\/p>\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\/221'>https:\/\/github.com\/mqyqingfeng\/Blog\/issues\/221<\/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=1412\"> 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-1412","post","type-post","status-publish","format-standard","hentry","category-learn"],"_links":{"self":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1412"}],"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=1412"}],"version-history":[{"count":1,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1412\/revisions"}],"predecessor-version":[{"id":2402,"href":"https:\/\/www.lccc.top\/index.php?rest_route=\/wp\/v2\/posts\/1412\/revisions\/2402"}],"wp:attachment":[{"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lccc.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}