命名
标识符
标识符(Identifier)必须只使用 ASCII 字母、数字、下划线(用于常量和结构化测试方法名)以及(很少使用的)’$’ 符号。
命名风格
TypeScript 通过类型表达信息,因此名称不应该用类型中已包含的信息来装饰。(另见 Testing Blog 了解更多不应包含的内容。)
此规则的一些具体示例:
- 不要为私有属性或方法使用前导或尾随下划线。
- 不要为可选参数使用
opt_前缀。- 对于访问器,参见下面的访问器规则。
- 不要特殊标记接口(
或IMyInterface),除非在其环境中是惯用的。当为类引入接口时,给它一个能表达接口存在原因的名称(例如MyFooInterfaceclass TodoItem和interface TodoItemStorage,如果接口表达的是用于 JSON 存储/序列化的格式)。 - 在
Observable后面加$后缀是一种常见的外部约定,有助于区分可观察值和具体值。是否采用此约定由各团队自行判断,但在项目内应该保持一致。
描述性名称
名称必须对新读者来说是描述性和清晰的。不要使用对项目外的读者来说模糊或不熟悉的缩写,也不要通过删除单词中的字母来进行缩写。
- **例外:**在 10 行或更少范围内的变量(包括不是导出 API 一部分的参数)可以使用短变量名(例如单个字母)。
// 好的标识符:
errorCount // 没有缩写。
dnsConnectionIndex // 大多数人知道 "DNS" 代表什么。
referrerUrl // "URL" 也一样。
customerId // "Id" 既普遍又不容易被误解。// 不允许的标识符:
n // 无意义。
nErr // 模糊的缩写。
nCompConns // 模糊的缩写。
wgcConnections // 只有你的团队知道这代表什么。
pcReader // 很多东西可以缩写为 "pc"。
cstmrId // 删除了内部字母。
kSecondsPerDay // 不要使用匈牙利命名法。
customerID // "ID" 的驼峰命名不正确。驼峰命名
将名称中的缩写词和首字母缩略词视为完整的单词,即使用
loadHttpUrl,而不是 ,除非平台名称要求(例如
loadHTTPURLXMLHttpRequest)。
美元符号
标识符通常不应该使用
$,除非第三方框架的命名约定要求。参见上文了解将 $
与 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;
}