# 排版
::: details 目录
[[toc]]
:::

## 基本要求
* 一个文件中只能定义一个类。
* 每行字符不超过 120 个字符，一个函数最多 200 行代码。
* 一行只允许有一条语句。
* 一行只允许定义一个变量。
* ```if```、```else if```、```else```、```for```、```while``` 强制使用大括号。只有一行代码也要用大括号括起来。
* 不得省略语句结束的分号。
* 类的 ```public``` 类型属性与函数不加访问修饰符；
* 如果函数没有返回值，必需使用 ```void```；
* 如果函数体为空，必须加注释”```// do nothing```“明确标明。
```typescript
f(x: number, y: string): void {
    // do nothing
}
```
* 如果函数还未完成，必须加注释”```// todo: ```原因“标明。
```typescript
typeList(): Array<string> {
    // todo: 类型列表未确认
    return null;
}
```

## 程序各部分的放置顺序
* 文件注释头
* ```import``` 导入引用的包
* 类、接口、枚举注释
* 定义类、接口、枚举
* 属性按 ```public```、```protected```、```private``` 顺序定义。相关的属性定义在一起
* 构造函数的定义放在所有函数前
* 函数按 ```public```、```protected```、```private``` 顺序定义。相关的函数定义在一起
* 重载函数时，实现函数放在重载函数的最后

## 留空
### 空行
* 相对独立的程序块之间应加空行。
* 代码块之间需隔一个空行（即”}“符号后跟一个空行），如果”}“后是上层代码的”}“，则不加空行。
* 属性定义与函数定义之间隔一空行。
* 属性与属性之间隔一空行。
* 属性的 ```get```/```set``` 不留空行。
* 每个函数定义与之前的代码之间隔一空行。

### 缩进
* 禁止使用空格和 tab 混合缩进，缩进控制每级 4 个空格。
* 代码层级通过”{“与"}”标注，“{”进一级，“}”退一级。
* “{”与代码定义（类、接口、枚举、函数、```if```、```switch```、```for```、```while等```）处于同一行。
* ```switch``` 与 ```case``` 为同级代码（缩进相同），```case``` 后代码缩进一级。

### 空格
* 逗号，冒号后要有一个空格。
* 运算符（数值、关系、逻辑）前后要有一个空格。非运算符（!）与取负运算符（-）不要空格。
* 类的继承符号“:“前后要保留一个空格。
* 函数返回类型，“:”与括号之间无空格，与返回值类型间有一个空格。
* 函数名与小括号间没有空格。
* 定义变量、属性、函数入参。名称后直接跟”:“，不需要空格。”:“与类型之间有一个空格。
* 小括号里开始不需要空格。
* ```for```、```if```、```else```、```switch``` 与小括号间有一个空格。
