Skip to Content

命名

标识符

标识符(Identifier)必须只使用 ASCII 字母、数字、下划线(用于常量和结构化测试方法名)以及(很少使用的)’$’ 符号。

命名风格

TypeScript 通过类型表达信息,因此名称不应该用类型中已包含的信息来装饰。(另见 Testing Blog  了解更多不应包含的内容。)

此规则的一些具体示例:

  • 不要为私有属性或方法使用前导或尾随下划线。
  • 不要为可选参数使用 opt_ 前缀。
  • 不要特殊标记接口(IMyInterfaceMyFooInterface),除非在其环境中是惯用的。当为类引入接口时,给它一个能表达接口存在原因的名称(例如 class TodoIteminterface TodoItemStorage,如果接口表达的是用于 JSON 存储/序列化的格式)。
  • Observable 后面加 $ 后缀是一种常见的外部约定,有助于区分可观察值和具体值。是否采用此约定由各团队自行判断,但在项目内应该保持一致。

描述性名称

名称必须对新读者来说是描述性和清晰的。不要使用对项目外的读者来说模糊或不熟悉的缩写,也不要通过删除单词中的字母来进行缩写。

  • **例外:**在 10 行或更少范围内的变量(包括不是导出 API 一部分的参数)可以使用短变量名(例如单个字母)。
// 好的标识符: errorCount // 没有缩写。 dnsConnectionIndex // 大多数人知道 "DNS" 代表什么。 referrerUrl // "URL" 也一样。 customerId // "Id" 既普遍又不容易被误解。
// 不允许的标识符: n // 无意义。 nErr // 模糊的缩写。 nCompConns // 模糊的缩写。 wgcConnections // 只有你的团队知道这代表什么。 pcReader // 很多东西可以缩写为 "pc"。 cstmrId // 删除了内部字母。 kSecondsPerDay // 不要使用匈牙利命名法。 customerID // "ID" 的驼峰命名不正确。

驼峰命名

将名称中的缩写词和首字母缩略词视为完整的单词,即使用 loadHttpUrl,而不是 loadHTTPURL,除非平台名称要求(例如 XMLHttpRequest)。

美元符号

标识符通常不应该使用 $,除非第三方框架的命名约定要求。参见上文了解将 $Observable 值一起使用的更多信息。

按标识符类型分类的规则

大多数标识符名称应根据标识符的类型遵循下表中的大小写规则。

风格类别
UpperCamelCase类(class) / 接口(interface) / 类型(type) / 枚举(enum) / 装饰器(decorator) / 类型参数(type parameter) / TSX 中的组件函数 / JSXElement 类型参数
lowerCamelCase变量(variable) / 参数(parameter) / 函数(function) / 方法(method) / 属性(property) / 模块别名(module alias)
CONSTANT_CASE全局常量值,包括枚举值。参见下面的常量
#ident私有标识符永远不使用。

类型参数

类型参数,如 Array<T> 中的参数,可以使用单个大写字符(T)或 UpperCamelCase

测试名称

xUnit 风格测试框架中的测试方法名可以使用 _ 分隔符进行结构化,例如 testX_whenY_doesZ()

_ 前缀/后缀

标识符禁止使用 _ 作为前缀或后缀。

这也意味着 _ 禁止单独用作标识符(例如表示参数未使用)。

提示:如果你只需要数组(或 TypeScript 元组)中的部分元素,可以在解构语句中插入额外的逗号来忽略中间的元素:

const [a, , b] = [1, 5, 10]; // a <- 1, b <- 10

导入

模块命名空间导入使用 lowerCamelCase,而文件名使用 snake_case,这意味着导入的大小写风格正确地不会匹配,例如

import * as fooBar from './foo_bar';

某些库可能常用一个违反此命名规则的命名空间导入前缀,但过于常见的开源使用使得违反规则的风格更具可读性。目前属于此例外的库只有:

常量

不可变性CONSTANT_CASE 表示一个值意图不被更改,可以用于技术上可以修改的值(即非深度冻结的值),以向用户表明它们不应被修改。

const UNIT_SUFFIXES = { 'milliseconds': 'ms', 'seconds': 's', }; // 即使根据 JavaScript 的规则 UNIT_SUFFIXES 是可变的, // 大写形式向用户表明不要修改它。

常量也可以是类的 static readonly 属性。

class Foo { private static readonly MY_SPECIAL_NUMBER = 5; bar() { return 2 * Foo.MY_SPECIAL_NUMBER; } }

全局性:只有在模块级别声明的符号、模块级别类的静态字段和模块级别枚举的值可以使用 CONST_CASE。如果一个值在程序的生命周期中可以被实例化多次(例如函数内声明的局部变量,或嵌套在函数中的类的静态字段),则必须使用 lowerCamelCase

如果一个值是实现接口的箭头函数,则可以声明为 lowerCamelCase

别名

为现有符号创建局部作用域别名时,使用现有标识符的格式。局部别名必须与源的现有命名和格式匹配。对于变量,使用 const 作为局部别名,对于类字段,使用 readonly 属性。

注意:如果你创建别名只是为了将其暴露给所选框架中的模板,请记住同时应用适当的访问修饰符

const {BrewStateEnum} = SomeType; const CAPACITY = 5; class Teapot { readonly BrewStateEnum = BrewStateEnum; readonly CAPACITY = CAPACITY; }
Last updated on