TypeScript的简洁代码-第1部分

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



首先,让我们弄清楚这些干净代码的原理是什么。 但是不幸的是,不太可能给出清晰的干净代码定义。 在某种程度上,这全都取决于人们,例如,当您来到博物馆时,您看图片时会想到什么是丑陋,但随后另一个人出现并说出了什么辉煌。 是的,我们在世界上具有某些确定的,普遍的特征,可以说一个或另一个是美丽的,但我们当然不能对所有这些都给出定义。 因此,这里仅仅是这种美的一些小标准,从那以后他选择了自己。 这些不是刻在花岗岩上的规则。 这些只是建议。


变数


使用枚举来记录


Enam可以帮助您记录代码。 例如,当我们担心变量与值不同时。


不好:


const GENRE = { ROMANTIC: 'romantic', DRAMA: 'drama', COMEDY: 'comedy', DOCUMENTARY: 'documentary', } projector.configureFilm(GENRE.COMEDY); class Projector { // delactation of Projector configureFilm(genre) { switch (genre) { case GENRE.ROMANTIC: // some logic to be executed } } } 

好:


 enum GENRE { ROMANTIC, DRAMA, COMEDY, DOCUMENTARY, } projector.configureFilm(GENRE.COMEDY); class Projector { // delactation of Projector configureFilm(genre) { switch (genre) { case GENRE.ROMANTIC: // some logic to be executed } } } 

功能介绍


避免类型检查


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)); } // Print first 10 Fibonacci numbers. print(10); 

好:


 // Generates an infinite stream of Fibonacci numbers. // The generator doesn't keep the array of all numbers. function* fibonacci(): IterableIterator<number> { let [a, b] = [0, 1]; while (true) { yield a; [a, b] = [b, a + b]; } } function print(n: number) { let i = 0; for (const fib of fibonacci()) { if (i++ === n) break; console.log(fib); } } // Print first 10 Fibonacci numbers. print(10); 

存在的库允许您通过链接诸如mapsliceforEach等方法,以与您自己的数组相同的方式使用迭代器。有关迭代器的高级操作,请参见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; // ... } const value = 100; const account: BankAccount = { balance: 0, // ... }; if (value < 0) { throw new Error('Cannot set negative balance.'); } account.balance = value; 

好:


 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; } // ... } //  `BankAccount`   . //    ,      , //      ``, //      . const account = new BankAccount(); account.balance = 100; 

创建具有私有/安全字段的对象


TypeScript支持访问类属性的public (默认)protectedprivate方式。


不好:


 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时会使用哪些原则?


待续...

Source: https://habr.com/ru/post/zh-CN484402/


All Articles