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
中 - 但它实际上会让您更加努力地理解代码,如果你必须看到完整的命名空间才能知道你在处理什么。
如果接口在 SqlClient
和 FooClient
之间是通用的,这就是您看到 System.Data.IConnection
的地方,它没有那么嵌套也没有那么具体。
我正在将一个 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
中 - 但它实际上会让您更加努力地理解代码,如果你必须看到完整的命名空间才能知道你在处理什么。
如果接口在 SqlClient
和 FooClient
之间是通用的,这就是您看到 System.Data.IConnection
的地方,它没有那么嵌套也没有那么具体。