You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确导出类中的静态getter并保证每次调用返回新实例?

如何正确导出类中的静态getter并保证每次调用返回新实例?

我完全懂你踩的这个坑——本来想通过导出类的静态getter来快速获取新的User实例,结果现在不管怎么用,拿到的都是同一个对象,改了一个另一个也跟着变,这肯定不是你想要的效果😅

先给你拆解下问题出在哪:你原来写的export const { newInstance } = User这个解构赋值,其实会立即执行一次User的newInstance getter,把它返回的第一个User实例直接赋值给了导出的newInstance变量。之后你在其他文件里引用这个变量时,拿到的永远是第一次生成的那个实例,自然不管怎么操作都会互相影响。

下面给你几个可行的解决方案,你可以根据自己的习惯选:


方案1:导出一个工厂函数(保留原getter)

如果你想保留类里的静态getter不变,可以额外写一个工厂函数来包装它,这样每次调用函数都会触发getter生成新实例:

// user.ts
class User {
  name: string = ''
  static get newInstance() {
    return new User()
  }
}

// 导出工厂函数,每次调用都触发getter获取新实例
export const getNewUser = () => User.newInstance;

使用的时候,只要调用这个函数就行:

import { getNewUser } from './user'
const user1 = getNewUser()
user1.name = 'roy1'
const user2 = getNewUser()
user2.name = 'roy2'

// 现在会打印:{ user1: User { name: 'roy1' }, user2: User { name: 'roy2' } }
console.log({user1, user2})

方案2:把静态getter改成静态方法(最推荐)

其实从语义上来说,“生成新实例”这种操作更适合用静态方法来实现,而不是getter。改成方法后,解构导出也不会有问题,只要调用时加括号就能生成新实例:

// user.ts
class User {
  name: string = ''
  // 把getter改成静态方法
  static newInstance() {
    return new User()
  }
}

// 直接解构导出这个方法
export const { newInstance } = User;

使用时记得调用方法:

import { newInstance } from './user'
const user1 = newInstance() // 这里要加()调用方法
user1.name = 'roy1'
const user2 = newInstance()
user2.name = 'roy2'

console.log({user1, user2}) // 现在两个实例各自独立

这种方式逻辑最清晰,其他开发者看代码也能一眼明白——要加调用才能拿到新实例,不会踩和你一样的坑。


方案3:导出带getter的对象(不常用但可行)

如果你既想保留原getter,又不想额外写工厂函数,可以导出一个带有同名getter的对象,这样每次访问对象的newInstance属性时,都会触发原类的getter生成新实例:

// user.ts
class User {
  name: string = ''
  static get newInstance() {
    return new User()
  }
}

// 导出一个自定义对象,内部用getter代理原类的newInstance
export const userFactory = {
  get newInstance() {
    return User.newInstance
  }
}

使用时通过对象访问属性:

import { userFactory } from './user'
const user1 = userFactory.newInstance
user1.name = 'roy1'
const user2 = userFactory.newInstance
user2.name = 'roy2'

console.log({user1, user2}) // 正常返回不同实例

个人最推荐方案2,因为它最符合TypeScript的代码习惯,语义明确,后续维护也不容易出问题。

备注:内容来源于stack exchange,提问作者Arst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:49:35