TypeScript编码规范

1 命名及约定

1.1 类

使用 PascalCase 进行命名。

Bad

class foo {}

Good

class Foo {}

1.2 类成员(变量、方法)

使用 camelCase 进行命名。

Bad

class Foo {
  Bar: number;
  Baz(): number {}
}

Good

class Foo {
  bar: number;
  baz(): number {}
}

1.3 接口

使用 PascalCase 进行命名,不要在接口名前加“I”。

接口成员使用 camelCase 进行命名。

Bad

interface IFoo {
  Bar: number;
  Baz(): number;
}

Good

interface Foo {
  bar: number;
  baz(): number;
}

1.4 命名空间

使用 PascalCase 进行命名。

Bad

namespace foo {}

Good

namespace Foo {}

1.5 枚举

枚举成员使用 PascalCase 进行命名。*Bad*

enum Color {
  red,
}

*Good*

enum Color {
  Red,
}

使用 PascalCase 进行命名。*Bad*

enum color {}

*Good*

enum Color {}

1.6 文件名

  • 使用破折号分隔描述性单词,比如:hero-list.ts。
  • 使用点将描述性名称与类型分开,比如:user-info.page.ts。
  • 尽量使用常规的几种类型名,包括.page,.service,.component,.pipe,.module,.directive,.controller 和.middleware。当然也可以自己创建其他类型,但不宜太多。
  • 类名与文件名匹配,并遵循类命名规范。
类名 文件名
export class AppComponent { } app.component.ts
export class HeroListComponent { } hero-list.component.ts
export class UserProfileService { } user-profile.service.ts

2 类型

不要使用 Number、String、Boolean、Object 为变量、数组和方法设置类型。*Bad*

baz(foo: String): String {
​
}

*Good*

baz(foo: string): string {
​
}

需显式地为变量、数组和方法编写类型(类型推论能够推断出类型的不需要声明类型)。*Bad*

class Bar {
  bar(input) {
    let isZero;
    const foo: number = 5;
    if (input === 5) {
      isZero = false;
    }
    const resultObject = {
      fo: foo,
      isZeroRes: isZero,
    };
    return resultObject;
  }
}

*Good*

class Bar {
  bar(input: number): BarResult {
    let isZero: boolean;
    const foo = 5;
    if (input === 0) {
      isZero = true;
    }
    const resultObject = {
      fo: foo,
      isZeroRes: isZero,
    };
    return resultObject;
  }
}
​
interface BarResult {
  fo: number;
  isZeroRes: boolean;
}

3 声明变量

  • 如果变量在其生命周期可能发生改变,尽量使用 let。

如果一个值在程序生命周期内不会改变,尽量使用 const。*Bad*

var bar = "bar";
var count;
if (true) {
  console.log(bar);
  count += 1;
}

*Good*

const bar = "bar";
let count: number;
if (true) {
  console.log(bar);
  count += 1;
}

4 对象

仅使用引号用于属于无效标识符的属性。*Bad*

const bad = {
  foo: 3,
  bar: 4,
  "data-blah": 5,
};

*Good*

const good = {
  foo: 3,
  bar: 4,
  "data-blah": 5,
};

在对象字面量里使用属性简写。*Bad*

const lukeSkywalker = "Luke Skywalker";
const obj = {
  lukeSkywalker: lukeSkywalker,
};

*Good*

const lukeSkywalker = "Luke Skywalker";
const obj = {
  lukeSkywalker,
};

使用{}进行对象创建。*Bad*

const  item  =  new  Object();

*Good*

const item = {};

5 字符串

使用单引号声明字符串。*Bad*

const bar = "bar";

*Good*

const bar = 'bar';

6 解构

访问数组中的多个数据时,使用解构。*Bad*

const arr = [1, 2, 3, 4];
const first = arr[0];
const second = arr[1];

*Good*

const arr = [1, 2, 3, 4];
const [first, second] = arr;

访问和使用对象的多个属性时,使用对象解构。*Bad*

const foo = user.firstName;
const bar = user.lastName;

*Good*

const { foo, bar } = user;

7 空格

  • 在定义类型前面加上空格。
  • 赋值等号两边加上空格。
  • 方法、类大括号前空格。
  • 对象冒号后空格。

*Bad*

class Foo {
  openDetail(item: string): void {
    let foo: string;
    foo = "";
    const foa = {
      name: "foo",
    };
    console.log(item);
  }
}

*Good*

class Foo {
  openDetail(item: string): void {
    let foo: string;
    foo = "";
    const foa = {
      name: "foo",
    };
    console.log(item);
  }
}

8 缩进

使用两个空格缩进。

9 分号

语句结尾添加分号。

*Bad*

const foo = "foo";

*Good*

const foo = "foo";

10 数组

使用 push 添加数据*Bad*

const foos = [];
foos[foos.length] = "abracadabra";

*Good*

const foos = [];
foos.push("abracadabra");

使用[]定义数组。*Bad*

let foos: Array<Foo>;

*Good*

let foos: Foo[];

TypeScript编码规范

https://ths-fe.github.io/2020/05/24/TypeScript编码规范/

作者

刘莹鑫

发布于

2020-05-24

更新于

2023-08-05

许可协议

CC BY-NC-SA 4.0


本文作者 xulin(海鸥技术部落),原载于团队 GitBook 技术 Wiki

TypeScript编码规范

TypeScript编码规范 1 命名及约定 1.1 类 使用 PascalCase 进行命名。 Bad Good 1.2 类成员(变量、方法) 使用 camelCase 进行命名。 Bad Good 1.3 接口 使用 PascalCase 进行命名,不要在接口名前加“I”。 接口成员使用 camelCase 进行命名。 Bad Good 1.4 命名空间 使用 PascalCase 进行命名。