在 JavaScript(和 TypeScript)中,从性能角度来看,使用类与对象来命名空间方法有什么区别吗?还有其他理由选择其中一种选择而不是另一种吗?
export const UserService = {
async findMany() {
// ...
},
async findById(id: number) {
// ...
}
}
export class UserService {
static async findMany() {
// ...
}
static async findById(id: number) {
// ...
}
}
没有构造函数的类上的静态方法/字段或多或少类似于创建无操作函数并将属性直接附加到该函数的实例。它们也有缺点。
静态方法/字段无法在打字稿类型/接口中进行注释。
这意味着您可以通过此处的类路线有效地创建类似单例的行为。你永远不可能拥有两个完全满足同一个契约的
UserService
类(尽管它们可能具有结构类型的优点,但它们不能共享接口),并且变得很难
(a) 配置服务(例如,服务需要连接字符串......如何将其提供给静态函数?) (b) 模拟服务进行测试。
这里更惯用的方法是定义一个类型/接口来声明您的函数
type UserService = {
findMany(): Promise<User[]>;
findById(id:number): Promise<User>;
}
export const userService: UserService = {
async findMany() {
// ...
},
async findById(id: number) {
// ...
}
}
那么任何需要
UserService
的东西都可以接受满足这个契约的参数。
function greetUsers(userService: UserService){
//...
}
这减少了使用类所隐含的紧密绑定,并为您提供了更大的灵活性,例如,创建一个用于创建和配置
UserService
实例的工厂函数。
function getUserService(connectionString:string):UserService{
const us:UserService = {
//...
}
return us;
}
类上的静态方法将极大地限制您执行此类操作的灵活性。