当前位置: 首页 > 知识库问答 >
问题:

在泛型Typescript类中实现单例

艾雪风
2023-03-14

我有一个泛型类型,它将是事件系统中事件的基类。我们希望这些是单例,但它也是泛型的,以便子类可以在事件触发时指定它们在回调中期望的参数的类型。

我拥有的东西看起来像这样:

export interface IEvent { }
export interfact IEventArg { }

export abstract class Event<TEvent extends IEvent, TEventArg extends IEventArg> implements IMessageHandler {

private static s_instance : any;
private static s_isInitializing : boolean;

constructor() {
    if (!Event.s_isInitializing) 
        throw new Error ("Use the GetInstance method to get this class instance.");
}

public static GetInstance<TEvent extends IEvent, TEventArg extends IEventArg>(type: { new() : T; }) : TEvent {
    if (!s_instance) {
        s_isInitializing = true;
        s_instance = new type();
        s_isInitializing = false;
    }

    return s_instance;
}
}

export class SelectionEvent extends Event<SelectionEvent, EmptyEventArg> {
...
}

var event = SelectionEvent.GetInstance(SelectionEvent);

这里有些东西我认为很奇怪,主要是因为打字稿的语言要求。GetInstance的参数似乎是必要的,因为< code>var x = new TEvent()似乎不被TypeScript允许。空接口有助于加强什么可以被接受为泛型类型。

这里似乎不起作用的是静态变量和泛型类型的组合。GetInstance方法中的块是我想做的,但显然它不会编译。我还担心静态实例变量不会为每个事件创建一次,而是每个事件实例创建一次,因此将被覆盖。

这里的任何指导将不胜感激。

共有1个答案

公羊俊德
2023-03-14

在 C# 中,泛型类的每个实例化(类型参数集)都有自己的一组静态成员。这意味着您可以编写一个单例模式,其中有一个 Foo 实例

在 TypeScript 中,情况并非如此。每个类只有一个构造函数,泛型或其他。这意味着类的静态端无法“看到”泛型类型参数,因为对于任何类 X

类的单例模式通常不适合TypeScript查看如何在TypeScript中定义Singleton。我认为你这里有一些XY问题,所以在没有关于你的用例的更多信息的情况下,我不能推荐任何具体的替代方案(也许可以发布一个单独的问题)。

此外,您永远不应该在TypeScript中有空接口。类型在结构上进行比较,因此任何两个空类型都是兼容的,您可以将任何内容分配给作为空接口键入的变量。

 类似资料:
  • 问题内容: 我想在Java中创建泛型类型的对象。请提出如何实现相同的建议。 注意:这似乎是一个简单的泛型问题。但是我打赌..不是。:) 假设我的类声明为: 问题答案: 你必须添加异常处理。 你必须在运行时传递实际类型,因为它不是编译后字节码的一部分,因此,没有显式提供它就无法知道它。

  • 我被分配了一个问题:编写一个通用的加权元素 到目前为止,我已经创建了类并实现了Compariable,但在为W创建compareTo()方法时遇到了问题。我有: 我遇到的问题是,当我比较权重时,没有找到数据的权重。还有没有其他我必须创建的方法来正确地拥有一个在其中一个变量上实现可比较的类?谢谢你的帮助

  • 问题内容: 我知道Java的泛型在某种程度上逊于.Net。 我有一个泛型类,我确实需要使用无参数构造函数实例化。如何解决Java的局限性? 问题答案: 一种选择是传递(或你感兴趣的任何类型-以任何方式指定适当的引用)并将该值保留为字段: 另一种选择是具有“工厂”接口,然后将工厂传递给泛型类的构造函数。这更加灵活,你无需担心反射异常。

  • 我们给identity添加了类型变量。 帮助我们捕获用户传入的类型(比如:),之后我们就可以使用这个类型。 之后我们再次使用了当做返回值类型。现在我们可以知道参数类型与返回值类型是相同的了。 这允许我们跟踪函数里使用的类型的信息。

  • 本节开始介绍 TypeScript 一些进阶知识点,第一个要介绍的泛型是 TypeScript 中非常重要的一个概念,它是一种用以增强函数、类和接口能力的非常可靠的手段。 使用泛型,我们可以轻松地将那些输入重复的代码,构建为可复用的组件,这给予了开发者创造灵活、可重用代码的能力。 1. 慕课解释 泛型在传统的面向对象语言中极为常见,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。