# hello.ts **Repository Path**: shell_way/hello.ts ## Basic Information - **Project Name**: hello.ts - **Description**: Hello TypeScript - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-24 - **Last Updated**: 2022-10-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # hello.ts ## 说明 ```sh git clone https://gitee.com/shell_way/hello.ts.git cd ./hello.ts/ npm install npm start ``` ## 许可 [MIT License](LICENSE) 。 ## TypeScript is JavaScript with syntax for types ### 简介 TypeScript (以下称 TS )是 JavaScript (以下称 JS )的扩展,其中 JS 又是 EMCAScript (以下称 ES )的扩展。从网景公司开发的最初名为 Mocha 的第一版 JS 开始,现今尚在使用的 JS 包含了历史发展中的一系列标准,均在不同的项目中有所使用。这些 **JS** 标准包括以下两类。 1. 语言标准 ES3 、 ES5 、 ES2015 至 ES2021 、 ESNext 。 2. 模块约定 CommonJS 、 AMD 、 SystemJS 、 UMD 、 ES2015 、 ES2020 、 ESNext 。 > 1. 这部分历史可以参考[《JavaScript 二十年》](https://cn.history.js.org/)。 > 2. ESNext 总为下个版本的 ES 标准,例如当前最新的语言标准为 ES2021 ,那么 ESNext 则为 ES2022 。 > 3. 本项目使用 ES2021 和 CommonJS 分别作为目标 JS 的语言标准和模块约定。 > 4. 目前 TS 实现了 ES2015 标准。 虽然 TS 增加了一系列特性例如强类型,但是这些均不是强制要求的,任何 JS 代码均是合法的 TS 代码。TS 代码必须由模块 `typescript` 编译为 JS 代码后才能被解释,学习 TS 的过程中想要避开 JS 是不可能的,因为 JS 就是 TS 的一部分。 > `ts-node` 提供了一个运行时用来隐藏转换为 JS 的过程,看上去像是 TS 代码被直接解释了。 ### 使用 ```sh npm run all ``` 然后使用 `node` 解释 `./dist/` 下对应的 JS ,例如。 ```sh node ./dist/ node ./dist/example/函数/ ``` > 如下所示,为了凸显 JS 的强类型特性,本项目中的示例代码尽量都写明了类型从而避免使用隐式的类型推论。但请注意实际的项目中几乎所有代码都在尽量使用类型推论。 > > | 普遍使用的类型推论 | 本项目中的类型指定 | > | ------------------ | ------------------------ | > | `const var = 1;` | `const var: number = 1;` | ### 介绍 #### 基础类型 略。需要注意以下几点。 1. 因为增加了类型所以同时提供了元组。 2. 增加了枚举类型 `enum` 。 3. 字符串内插和模板字符串,包括带标签的模板字符串。 4. 注意以下类型 `any` 、 `void` 、 `null` 、 `undefined` ,还有俩几乎用不到的 `never` 和 `symbol` 。 #### 变量声明和定义 略。注意 `let` 、 `const` 、 `var` 的作用域。 #### 流程控制 略。 #### 函数 见[函数](example/函数/index.ts)。 #### 类 见[类](example/类/index.ts) #### 类型和接口 类型用于指定一个类型的别名,接口用于定义数据类型,见[类型和接口](example/类型和接口/index.ts)。 #### 构造和解构 见[构造和解构](example/构造和解构/index.ts)。 #### 导入和导出 这部分涉及到上文提到的诸多模块约定,此处只讨论在 TS 中被广泛使用的 ESM ( ESXXXX )。见[导入和导出](example/导入和导出/index.ts)。 > 这些标准中。 > > 1. CommonJS 在 NodeJS 中被广泛使用。 > 2. ESM 在 JS (网页)、 NodeJS 、 TS 和网页中被广泛使用。 > 3. AMD 通常用于服务于 JS (网页)。 > 4. UMD 适用于全场景交叉式导入导出,但是因为代码不够简洁而不够流行。 #### 异步 Promise 表示一个对象创建时无法确定、未来会确定的值。异步方法返回一个 Promise,以便在未来某个时候把值交给使用者。使用 `async` 关键字可以声明一个异步函数,在异步函数中可以使用 `await` 关键字同步等待一个 Promise 对象。 一个 Promise 必然处于以下几种状态之一。 | 状态 | 说明 | | ----------- | ------------------------------------------ | | `pending` | 待定:初始状态,既没有被兑现,也没有被拒绝 | | `fulfilled` | 已兑现:操作成功完成 | | `rejected` | 已拒绝:操作失败 | 待定状态的 Promise 对象**未来**要么会通过一个值被兑现 `fulfilled` ,要么会通过一个原因被拒绝 `rejected`,没有其他可能。 见[异步](example/异步/index.ts)。 #### 命名空间 避免使用任何命名空间, ESM 一定可以实现命名空间的所有功能并且有更好的灵活性。 ```ts namespace n1 { export const n = 1; export const f: (n: number) => number = (n: number): number => n; } import n = n1.n; const f = n1.f; console.log(f === n1.f); console.log(f(n) === n1.f(n1.n)); ``` 在 ESM 中一般有以下形式完成同样的功能。 文件 `./n1.ts` 做以下导出。 ```ts export const n = 1; export const f: (n: number) => number = (n: number): number => n; export default { n, f }; ``` 然后在其他文件中导入。 ```ts import { n, f } from "./n1"; import * as n1 from "./n1"; import nn from "./n1"; console.log(f === n1.f, f === nn.f, f(n) === n1.f(n1.n), f(n) === nn.f(nn.n)); ``` #### 装饰器 类中不同声明上的装饰器将按以下规定的顺序应用。 1. 实例成员依次应用参数装饰器、方法装饰器、访问符装饰器、属性装饰器 2. 静态成员依次应用参数装饰器、方法装饰器、访问符装饰器、属性装饰器 3. 构造函数应用参数装饰器 4. 类应用类装饰器 见[装饰器](example/装饰器/index.ts) 。 #### 其他 一些语言无关但是常用的东西 ##### lodash [Lodash](https://github.com/lodash/lodash) 是一个操作数据结构的工具集,能够惰性求值的链使 lodash 的工具可以协作完成复杂的工作。见 [Lodash](example/Lodash/index.ts) 。