|
| 1 | +--- |
| 2 | +title: 面向编程初学者的 TypeScript |
| 3 | +short: 面向编程初学者的 TS |
| 4 | +layout: docs |
| 5 | +permalink: /zh/docs/handbook/typescript-from-scratch.html |
| 6 | +oneline: 从零开始学习 TypeScript |
| 7 | +--- |
| 8 | + |
| 9 | +恭喜你选择 TypeScript 作为第一门编程语言 —— 你已经做出了明智的决定! |
| 10 | + |
| 11 | +或许你已经听说 TypeScript 是 JavaScript 的“调味料”或“变体”。在现代编程语言中,TypeScript(TS)和 JavaScript(JS)之间的关系相当独特,因此进一步了解这种关系,将帮助你了解如何把 TypeScript 添加到 JavaScript 中。 |
| 12 | + |
| 13 | +## 什么是 JavaScript? 一段简史 |
| 14 | + |
| 15 | +JavaScript(也称为ECMAScript)诞生时是一种简单的浏览器脚本语言。当它被发明时,它被期望用于网页中嵌入的简短代码片段。这些片段通常不超过几十行。因此,早期的 Web 浏览器执行此类代码的速度非常慢。但是,随着时间的流逝,JS 变得越来越流行,并且 Web 开发者开始使用它来创造交互式体验。 |
| 16 | + |
| 17 | +Web 浏览器开发者通过优化执行引擎(动态编译)和扩展可以完成的功能(添加API)来应对 JS 日益增加的使用量,这反过来又使 Web 开发者更多地使用 JS。在现代网站上,你的浏览器经常运行超过数十万行代码的应用程序。这是“网络”的长期而渐进的发展,从一个简单的静态页面网络开始,逐渐演变成一个用于各种丰富 _应用程序_ 的平台。 |
| 18 | + |
| 19 | +不仅如此,JS已经变得足够流行,以至于可以在浏览器环境之外使用。例如用 node.js 实现 JS 服务器。JS “随处运行”的特性使其成为跨平台开发的颇具吸引力的选择。如今,有许多开发者 _只_ 使用 JavaScript 便可完成全栈编程! |
| 20 | + |
| 21 | +总之,我们有一种专为快速使用而设计的语言,后来发展为功能强大的工具,可以编写具有数百万行的应用程序。每种语言都有它的 _怪异之处_, 令人感到古怪或者惊异。JavaScript 略显简陋的开端使得它有 _很多_ 个怪异之处。 一些例子: |
| 22 | + |
| 23 | + |
| 24 | +- JavaScript的等于运算符(`==`)_强制_ 其参数,导致意外行为: |
| 25 | + |
| 26 | + ```js |
| 27 | + if ("" == 0) { |
| 28 | + // 他们相等!但是为什么呢?? |
| 29 | + } |
| 30 | + if (1 < x < 3) { |
| 31 | + // x是 *任何* 值都为真! |
| 32 | + } |
| 33 | + ``` |
| 34 | + |
| 35 | +- JavaScript 还允许访问不存在的属性: |
| 36 | + |
| 37 | + ```js |
| 38 | + const obj = { width: 10, height: 15 }; |
| 39 | + // 为什么是 NaN?拼写好难! |
| 40 | + const area = obj.width * obj.heigth; |
| 41 | + ``` |
| 42 | + |
| 43 | +大多数编程语言会在发生此类错误时抛出错误提示,有些会在编译期间(在任何代码运行之前)这样做。在编写小型程序时,这种诡异表现很烦人,但很容易管理。 当编写具有成百上千行代码的应用程序时,这些源源不断的惊喜将是一个严重的问题。 |
| 44 | + |
| 45 | +## TypeScript: 静态类型检查器 |
| 46 | + |
| 47 | +前面我们提到,一些语言根本不允许那些错误的程序运行。在不运行代码的情况下检测其中的错误称为 _静态检查_ 。根据被操作的值的种类来确定是什么错误和什么不是错误,这称为静态 _类型_ 检查。 |
| 48 | + |
| 49 | +TypeScript 在执行之前,基于 _值的类型_ 检查程序是否有错误。它是 _静态类型检查器_。例如,基于 `obj` 的 _类型_,TypeScript 在上面的最后一个示例中发现了一个错误: |
| 50 | + |
| 51 | +```ts twoslash |
| 52 | +// @errors: 2551 |
| 53 | +const obj = { width: 10, height: 15 }; |
| 54 | +const area = obj.width * obj.heigth; |
| 55 | +``` |
| 56 | + |
| 57 | +### JavaScript 的类型化超集 |
| 58 | + |
| 59 | +不过,TypeScript 与 JavaScript 是什么关系呢? |
| 60 | + |
| 61 | +#### 语法 |
| 62 | + |
| 63 | +TypeScript 是 JavaScript 的 _超集_ :因此 JS 语法是合法的 TS。语法是指我们编写文本以组成程序的方式。例如,这段代码有一个 _语法_ 错误,因为它缺少一个 `)`: |
| 64 | + |
| 65 | +```ts twoslash |
| 66 | +// @errors: 1005 |
| 67 | +let a = (4 |
| 68 | +``` |
| 69 | +
|
| 70 | +TypeScript 不会将任何 JavaScript 代码视为错误。这意味着你可以将任何有效的 JavaScript 代码放在 TypeScript 文件中,而不必担心它的确切编写方式。 |
| 71 | +
|
| 72 | +#### 类型 |
| 73 | +
|
| 74 | +但是,TypeScript 是一个 _类型化_ 的超集,意味着它添加了针对如何使用不同类型的值的规则。之前关于 `obj.heigth` 的错误不是 _语法_ 错误,而是以不正确的方式使用了某种值( _类型_ )。 |
| 75 | +
|
| 76 | +再举一个例子,这段 JavaScript 代码可以在浏览器中运行,它 _会_ 打印一个值: |
| 77 | +
|
| 78 | +```js |
| 79 | +console.log(4 / []); |
| 80 | +``` |
| 81 | +
|
| 82 | +该语法合法的程序打印出 `Infinity` 。但是,TypeScript 认为将数字除以数组是无意义的操作,并且会报错: |
| 83 | +
|
| 84 | +```ts twoslash |
| 85 | +// @errors: 2363 |
| 86 | +console.log(4 / []); |
| 87 | +``` |
| 88 | +
|
| 89 | +你可能 _真的_ 想将数字除以数组,也许只是想看看会发生什么,但是在大多数时候,这是编程错误。TypeScript 的类型检查器旨在允许正确的程序通过,同时仍然捕获尽可能多的常见错误。(稍后,我们将学习如何配置 TypeScript,从而控制检查代码的严格程度。) |
| 90 | +
|
| 91 | +如果将某些代码从 JavaScript 文件移动到 TypeScript 文件,可能会出现 _类型错误_ ,具体取决于代码的编写方式。这些或许是代码真实存在的问题,或者 TypeScript 过于保守。在本指南中,我们将演示如何增添各种 TypeScript 语法来消除此类错误。 |
| 92 | +
|
| 93 | +#### 运行时行为 |
| 94 | +
|
| 95 | +TypeScript 保留了 JavaScript 的 _运行时行为_ 。例如,在JavaScript 中被零除的结果是 `Infinity`,而不是抛出运行时异常。原则上,TypeScript **绝不** 改变 JavaScript 代码的运行时行为。 |
| 96 | +
|
| 97 | +这意味着,如果将代码从 JavaScript 迁移到 TypeScript ,即使 TypeScript 认为代码有类型错误,也可以 **保证** 以相同的方式运行。 |
| 98 | +
|
| 99 | +保持与 JavaScript 运行时行为相同是 TypeScript 的基本承诺。因为这意味着你可以轻松地在两种语言之间转换,而不必担心一些细微差别可能会使程序停止工作。 |
| 100 | +
|
| 101 | +<!-- |
| 102 | +Missing subsection on the fact that TS extends JS to add syntax for type |
| 103 | +specification. (Since the immediately preceding text was raving about |
| 104 | +how JS code can be used in TS.) |
| 105 | +--> |
| 106 | +
|
| 107 | +#### 擦除类型 |
| 108 | +
|
| 109 | +粗略地说,一旦 TypeScript 的编译器完成了检查代码的工作,它就会 _擦除_ 类型以生成最终的“已编译”代码。这意味着一旦您的代码被编译,生成的普通 JS 代码便没有类型信息。 |
| 110 | +
|
| 111 | +这也意味着 TypeScript 绝不会根据它推断的类型更改程序的 _行为_ 。最重要的是,尽管您可能会在编译过程中看到类型错误,但类型系统自身与程序如何运行无关。 |
| 112 | +
|
| 113 | +最后,TypeScript 不提供任何额外运行时库。你的程序会使用与 JavaScript 程序相同的标准库(或外部库)。因此你不需要学习其他专属于 TypeScript 的框架。 |
| 114 | +
|
| 115 | +<!-- |
| 116 | +Should extend this paragraph to say that there's an exception of |
| 117 | +allowing you to use newer JS features and transpile the code to an older |
| 118 | +JS, and this might add small stubs of functionality when needed. (Maybe |
| 119 | +with an example --- something like `?.` would be good in showing readers |
| 120 | +that this document is maintained.) |
| 121 | +--> |
| 122 | +
|
| 123 | +## 学习 JavaScript 和 TypeScript |
| 124 | +
|
| 125 | +我们经常看到这样的问题:“我该学习 JavaScript 还是 TypeScript?”。 |
| 126 | +
|
| 127 | +答案是,不学习 JavaScript,就无法学习 TypeScript!TypeScript 共用了 JavaScript 的语法和运行时行为。因此,对JavaScript 的任何了解都可以帮助你学习 TypeScript 。 |
| 128 | +
|
| 129 | +程序员可以使用很多很多资源来学习 JavaScript 。如果你正在编写 TypeScript,_不应该_ 忽略这些资源。例如,带有 `javascript` 标签的 StackOverflow 问题大约比 `typescript` 标签的多20倍,但是 _所有_ `javascript`问题也适用于 TypeScript 。 |
| 130 | +
|
| 131 | +如果你正在搜索“如何在 TypeScript 中对列表进行排序”之类的内容,请记住: **TypeScript 是带有编译时类型检查器的 JavaScript 运行时** 。在 TypeScript 中对列表进行排序的方式与在 JavaScript 中相同。如果你找到直接使用 TypeScript 的资源,那也很好,但解决运行时任务的日常问题时,不要局限地认为你需要特定于 TypeScript 的答案。 |
| 132 | +
|
| 133 | +## 下一步 |
| 134 | +
|
| 135 | +以下是 TypeScript 中常用语法和工具的简要介绍。在这里,你可以: |
| 136 | +
|
| 137 | +- 学习一些 JavaScript 基础知识 ([Mozilla Web Docs 的 JavaScript 指南 ](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide) 是个不错的开始) |
| 138 | +- 继续阅读 [JavaScript 程序员的 TypeScript](/docs/handbook/typescript-in-5-minutes.html) |
| 139 | +- 阅读完整手册 [从头至尾](/docs/handbook/intro.html) (30m) |
| 140 | +- 探索 [游乐场示例](/play#show-examples) |
| 141 | +
|
| 142 | +<!-- Note: I'll be happy to write the following... --> |
| 143 | +<!-- |
| 144 | +## Types |
| 145 | +
|
| 146 | + * What's a type? (For newbies) |
| 147 | + * A type is a *kind* of value |
| 148 | + * Types implicitly define what operations make sense on them |
| 149 | + * Lots of different kinds, not just primitives |
| 150 | + * We can make descriptions for all kinds of values |
| 151 | + * The `any` type -- a quick desctiption, what it is, and why it's bad |
| 152 | + * Inference 101 |
| 153 | + * Examples |
| 154 | + * TypeScript can figure out types most of the time |
| 155 | + * Two places we'll ask you what the type is: Function boundaries, and later-initialized values |
| 156 | + * Co-learning JavaScript |
| 157 | + * You can+should read existing JS resources |
| 158 | + * Just paste it in and see what happens |
| 159 | + * Consider turning off 'strict' --> |
0 commit comments