如何正确导出类中的静态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
相关产品推荐
相关产品推荐

