在 TypeScript 中命名抽象类和接口

iva*_*kov 7 javascript oop naming-conventions node.js typescript

这个问题存在争议,也没有一致性,所以我想澄清一下打字稿的类、文件名、后缀等的命名标准。我想知道,你在 Typescript 项目中如何命名抽象类、接口以及逻辑组织代码?

可能的解决方案:

对于接口:

  • 以“I”作为前缀
  • 以“Interface”作为后缀
  • 完全不添加任何东西

对于抽象类:

  • 以“摘要”为前缀
  • 像“Base”这样的前缀
  • 一无所有

使用 C# 的示例

public class User : AbstractUser, IUser
Run Code Online (Sandbox Code Playgroud)

Java 和 PHP 中相同

public class User extends AbstractUser implements UserInterface
Run Code Online (Sandbox Code Playgroud)

在打字稿中

export class User extends AbstractUser implements UserInterface
Run Code Online (Sandbox Code Playgroud)

这是基于 C#、Java 和现代 PHP7+ 等语言的框架中使用的常规方法


微软建议添加“Interface”作为后缀,这对我来说是正确的。 https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Interfaces.md#class-types

另一个流行的风格指南建议不要为接口的前缀添加任何后缀,对我来说违反了规则,可读性和整体看起来都是错误的。https://basarat.gitbooks.io/typescript/content/docs/styleguide/styleguide.html#interface

export class User extends AbstractUser implements User
Run Code Online (Sandbox Code Playgroud)

iva*_*kov 1

我们的节点应用程序对接口的要求很高——它们无处不在,我们进行类型检查和类型提示,因此有意义的名称对我们来说非常重要。

import {MediaInterface} from 'app/models/mediaInterface';
import {ServerInterface} from 'app/server/serverInterface';
import {UserInterface} from 'app/models/userInterface';

export class MediaStorage extends AbstractStorage implements StorageInterface {

  /**
   * current user
   * @private
   */
  private user: UserInterface;

  /**
   * @constructor
   * @param {ServerInterface} app
   */
  constructor(private app: ServerInterface) {
    // ...
  }

  /**
   * @param {UserInterface} user
   * @returns {Promise<any>}
   */
  public deleteUserMedia(user: UserInterface): Promise<any> {
    // ...
  }

  /**
   * @param {object} req request
   * @param {object} res response
   * @returns {Promise<MediaInterface>}
   */
  public create(req: any, res: any): Promise<MediaInterface> {
     // ...
  }

}
Run Code Online (Sandbox Code Playgroud)