大项目的标配：Typescript
===========

Javascript（之后简称JS）作为后端语言来说，最大的问题就是其灵活性。我们说，**写时爽一时，上线火葬场**，说的就是JS。

随着时代的发展，玩具语言JS出现了大量的类型检测解决方案，比较出名的有Facebook的flow和微软的Typescript。

在众多类型检测解决方案中，Typescript（之后简称TS），脱颖而出。其出色的面向对象设计，对ES系列语言的支持，最重要的类型检测，都是在首屈一指的。

因此，在后端大项目之中，TS已经逐渐成为标配。

**学习TS的成本是非常低的。**

让我们通过本次的教程，使用面向对象的方式封装我们的``Koa``框架，使之成为一款好用的企业级框架。


配置TS
===========

```
npm init //一直回车
npm install -g typescript
npm install --save koa
npm install --save koa-router
npm install --save @types/koa
npm install --save @types/koa-router
```

安装完以后，我们输入
```
tsc -v

//Version 2.5.2
```
证明安装成功了。

接下来，我们配置一下ts的一些东西，
```
tsc -init
```
会出现一个tsconfig.json，复制以下内容覆盖掉tsconfig.json中的东西
```json
{
  "compilerOptions": {
    "module": "commonjs", //指定生成哪个模块系统代码
    "target": "es2017", //目标代码类型
    "noImplicitAny": true, //在表达式和声明上有隐含的'any'类型时报错。
    "sourceMap": false, //用于debug   
    // "rootDir": "./build", //仅用来控制输出的目录结构--outDir。
    "outDir": "./dist", //重定向输出目录。   
    "watch": false, //在监视模式下运行编译器。会监视输出文件，在它们改变时重新编译。
    "noUnusedLocals": true,
    "strict": true,
    "experimentalDecorators": true
  },
  "include": [
    "src/**/*",
    // "test/**/*"
  ]
}
```
我们在根目录下新建一个src目录，用于存放我们框架的代码，在src下新建一个``app.ts``。
输入以下代码：

```javascript
import * as Koa from 'koa';
import * as Router from 'koa-router';

const app = new Koa;

const route = new Router;

route.get('/', async (ctx, next) => {
    ctx.body = 'hello ts-koa';
})

app.use(route.routes());

app.listen(3000, '127.0.0.1', () => {
    console.log('服务器在运行');
})


```

在根目录下，输入命令```tsc```。

此时就会出现一个dist目录，里面就是我们编译过的代码。

值得注意的是，我们的.ts代码是不能直接运行的，必须要通过tsc编译之后才能跑，我们要跑的也是编译之后的代码。

输入命令
```
node ./dist/app.js
```
我们的服务器就正式跑起来了，打开浏览器``http://127.0.0.1:3000/``,我们就能看见字符串：
```
hello ts-koa
```


下一章：[自动编译Ts与自动重启](https://github.com/floveluy/Burnjs/blob/master/example/books/2.%E8%87%AA%E5%8A%A8%E7%BC%96%E8%AF%91ts%2B%E8%87%AA%E5%8A%A8%E9%87%8D%E5%90%AF.md)


