TypeScript:组织相关 类 和接口

TypeScript: Organizing related classes & interfaces

我正在将一个 JavaScript 项目移植到 TypeScript,但我不确定如何组织相关实体 (types/interfaces/classes)。

以下是我正在考虑的不同方法。

所有接口前缀为class名称

interface IFooOptions {}

class Foo {
  constructor(options: IFooOptions) {}
}

// usage
var foo = new Foo({});

创建模块:

module Foo {
  export interface IOptions {
    // ...
  }

  export class Foo {
    constructor(options: IOptions) {}
  }
}

// usage
var foo = new Foo.Foo({});

创建一个带有工厂函数的模块:

module Foo {
  export interface IOptions {
    // ...
  }

  export class Foo {
    constructor(options: IOptions) {}
  }

  export function create(options: IOptions): Foo {
    return new Foo(options);
  }
}

// usage
var foo = Foo.create({});

这些方法有哪些pros/cons?社区有约定吗?

对于内部模块,它看起来像这样:

module Foo {
  export interface FooOptions {
    // ...
  }

  export class Foo {
    constructor(options: FooOptions) {}
  }
}

// usage
var foo = new Foo.Foo({
    //...
});

不鼓励在接口上使用 I 前缀(尽管它确实存在)。

接口名称的特殊性来自于越深入名称越具体的原则。所以你从一般性开始,变得更具体,有点像这个来自 C# 的例子(在 C# 中,接口推荐使用 I 前缀,但它是一个名义类型系统,而 TypeScript 是结构化的)...

System.Data.SqlClient.SqlConnection
System.Data.FooClient.FooConnection

请注意,他们 可能 使用了 Connection,因为它嵌套在 SqlClient 中 - 但它实际上会让您更加努力地理解代码,如果你必须看到完整的命名空间才能知道你在处理什么。

如果接口在 SqlClientFooClient 之间是通用的,这就是您看到 System.Data.IConnection 的地方,它没有那么嵌套也没有那么具体。