Как создать синглтон класс в JavaScript с условным параметром

Проблема с инициализацией синглтона

У меня есть класс CartService, который должен работать как синглтон, но с возможностью передачи параметра при создании:

var CART_ITEMS_KEY = 'SOME_KEY';

export class CartService {
    private static instance: CartService;
    private items: CartItem[] = [];
    private authService: AuthService;
    private apiService: APIService;
    private endpoint: AxiosInstance;

    constructor(cartItemsKey) {
        CART_ITEMS_KEY = cartItemsKey;
        this.authService = AuthService.getInstance();
        this.apiService = APIService.getInstance();
        this.endpoint = this.apiService.createEndpoint('cart');
        this.initialize();
    }

    public static getInstance(): CartService {
        if (!CartService.instance) {
            CartService.instance = new CartService();
        }
        return CartService.instance;
    }
}

Также у меня есть хук для работы с сервисами:

import { useMemo } from 'react';

export function useService<T>(service: { new (): T; getInstance(): T }): T {
    return useMemo<T>(() => service.getInstance(), []);
}

export function useClass<S, A extends []>(Class: { new (...args: A): S }, ...args: A): S {
    return useMemo<S>(() => new Class(...args), []);
}

Я хочу инициализировать CartService с параметром и использовать его в useService так:

useService(CartService("SOME_NEW_KEY"))

Но пробуя разные подходы, я сталкиваюсь с ошибками. Как правильно реализовать синглтон с условным параметром?

У меня была такая же задача - сделал через статик метод initialize(key). В getInstance() добавил проверку, что инстанс проинициализирован, если нет - кидаю ошибку. CartService.initialize(‘SOME_KEY’) вызываешь один раз при старте приложения, потом везде useService(CartService) работает как обычно. Главное следить, чтобы initialize вызывался до первого использования.

Может стоит пересмотреть архитектуру? Если нужны разные ключи - это уже не синглтон. Попробуй статический метод create(key), который возвращает нужный инстанс, а getInstance() убери. Или вообще откажись от синглтона - обычный класс с DI контейнером проще тестировать.