根据用于TypeScript的干净代码的原则偶然发现了这些材料并阅读后,我决定接受其翻译。 在这里,我想与您分享一些摘录,因为纯TypeScript代码的某些点重复了JavaScript的相同原理,因此在此不再赘述,如果有趣的话,JS的翻译已经发布在中心(@ BoryaMogila )或您可以在原始资料中熟悉它们。

首先,让我们弄清楚这些干净代码的原理是什么。 但是不幸的是,不太可能给出清晰的干净代码定义。 在某种程度上,这全都取决于人们,例如,当您来到博物馆时,您看图片时会想到什么是丑陋,但随后另一个人出现并说出了什么辉煌。 是的,我们在世界上具有某些确定的,普遍的特征,可以说一个或另一个是美丽的,但我们当然不能对所有这些都给出定义。 因此,这里仅仅是这种美的一些小标准,从那以后他选择了自己。 这些不是刻在花岗岩上的规则。 这些只是建议。
变数
使用枚举来记录
Enam可以帮助您记录代码。 例如,当我们担心变量与值不同时。
不好:
const GENRE = { ROMANTIC: 'romantic', DRAMA: 'drama', COMEDY: 'comedy', DOCUMENTARY: 'documentary', } projector.configureFilm(GENRE.COMEDY); class Projector {
好:
enum GENRE { ROMANTIC, DRAMA, COMEDY, DOCUMENTARY, } projector.configureFilm(GENRE.COMEDY); class Projector {
功能介绍
避免类型检查
TypeScript是JavaScript语法的超集,并为该语言添加了其他静态类型检查。 始终喜欢指定变量类型,参数和返回值,以充分利用TypeScript。 这使得将来的重构更加容易。
不好:
function travelToTexas(vehicle: Bicycle | Car) { if (vehicle instanceof Bicycle) { vehicle.pedal(currentLocation, new Location('texas')); } else if (vehicle instanceof Car) { vehicle.drive(currentLocation, new Location('texas')); } }
好:
type Vehicle = Bicycle | Car; function travelToTexas(vehicle: Vehicle) { vehicle.move(currentLocation, new Location('texas')); }
使用迭代器和生成器
在处理用作流的数据集合时,请使用生成器和迭代器。
这有几个原因:
- 从被调用对象决定多少个元素的意义上说,将被调用对象与生成器实现分开
有访问权限 - 懒执行,项目按需传递
- 对使用
for-of
语法的元素进行迭代的内置支持 - 迭代器允许您实现优化的迭代器模式
不好:
function fibonacci(n: number): number[] { if (n === 1) return [0]; if (n === 2) return [0, 1]; const items: number[] = [0, 1]; while (items.length < n) { items.push(items[items.length - 2] + items[items.length - 1]); } return items; } function print(n: number) { fibonacci(n).forEach(fib => console.log(fib)); }
好:
存在的库允许您通过链接诸如map
, slice
, forEach
等方法,以与您自己的数组相同的方式使用迭代器。有关迭代器的高级操作,请参见itiriri示例(或用于操作异步迭代器的itiriri-async )。
import itiriri from 'itiriri'; function* fibonacci(): IterableIterator<number> { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } itiriri(fibonacci()) .take(10) .forEach(fib => console.log(fib));
对象和数据结构
使用getter和setter
TypeScript支持getter和setter的语法。 使用getter和setter来访问对象数据要比直接访问其属性好得多。 “为什么?” 你问。 以下是原因列表:
- 如果您不仅要实现对属性的访问,还需要在一个地方而不是整个代码中更改实现。
- 验证易于在
set
实施级别上实施 - 内部状态的封装
- 轻松在getter和setter级别添加日志记录和错误处理
- 您可以从服务器延迟加载对象的属性,例如,
不好:
type BankAccount = { balance: number;
好:
class BankAccount { private accountBalance: number = 0; get balance(): number { return this.accountBalance; } set balance(value: number) { if (value < 0) { throw new Error('Cannot set negative balance.'); } this.accountBalance = value; }
创建具有私有/安全字段的对象
TypeScript支持访问类属性的public
(默认) , protected
和private
方式。
不好:
class Circle { radius: number; constructor(radius: number) { this.radius = radius; } perimeter() { return 2 * Math.PI * this.radius; } surface() { return Math.PI * this.radius * this.radius; } }
好:
class Circle { constructor(private readonly radius: number) { } perimeter() { return 2 * Math.PI * this.radius; } surface() { return Math.PI * this.radius * this.radius; } }
尊敬的读者,使用TypeScript时会使用哪些原则?
待续...