Typescript-应用程序范围的状态(单例?)

Typescript-应用程序范围的状态(单例?),typescript,Typescript,我是typescript的初学者,我读过很多关于typescript和Singleton的书,我仍然可以让它工作 我的问题与此相同: 我也读过这篇文章: 还有这个: 最后,当我从一个模块转到另一个模块时,我的单例类似乎总是处于默认状态 调用getInstance()时,由于该值设置为new Path(),我很明显,单例总是处于默认状态,但在许多联机源(如前两个提供的源)中,这是一种方法 我做错了什么?谢谢 这是我的单例(Path.ts): 路径定义.ts module PathDefiniti

我是typescript的初学者,我读过很多关于typescript和Singleton的书,我仍然可以让它工作

我的问题与此相同:

我也读过这篇文章: 还有这个:

最后,当我从一个模块转到另一个模块时,我的单例类似乎总是处于默认状态

调用
getInstance()
时,由于该值设置为
new Path()
,我很明显,单例总是处于默认状态,但在许多联机源(如前两个提供的源)中,这是一种方法

我做错了什么?谢谢

这是我的单例(Path.ts):

路径定义.ts

module PathDefinition{
    export function defaultDefinition(){
        var nodes = [
            new NodeModel(...),
            new NodeModel(...)
        ];
        var links = [
            new LinkModel(...),
            new LinkModel(...)
        ];
        Path.getInstance().setPath(nodes, links);
    }
}
export = PathDefinition;
控制器

module Controller{
    export function init(){
        console.log(Airflow.getInstance().nodes());
        //console.log => undefined
    }
}
编辑


作为一名C#开发人员,我认为将每个文件内容包装成一个“模块”(或Paleo提到的名称空间)是组织代码的最佳方式。在阅读了Paleo提供的链接,尤其是这一链接之后,我明白了为什么我上面的代码不是处理Typescript的最佳方式

下面是一个简化的示例,它导致重新使用您的
路径
类的相同实例。我已经删除了大部分代码,只是为了显示工作情况

模块1.ts

class Path {
    public nodes: string[] = [];
}

export const PathSingleton = new Path();
这里的
const
只存在一次,即使我们将在几个地方导入此模块

其他模块

import { PathSingleton } from './module';

PathSingleton.nodes.push('New OtherModule Node');
console.log(PathSingleton.nodes);

export const example = 1;
我们已将添加到此模块中的节点列表

app.ts

import { PathSingleton } from './module';
import { example } from './othermodule';

PathSingleton.nodes.push('New Node');
console.log(PathSingleton.nodes);

const x = example;
我们在这里也在增加

运行此简单应用程序会产生以下输出

From othermodule.js
[ 'New OtherModule Node' ]
From app.js
[ 'New OtherModule Node', 'New Node' ]

最后一行是所有交互都发生在同一个实例上的“证据”。

它应该有效。但是…多么糟糕的代码!您可以使用
模块
创建
命名空间
。传统的
export=
似乎是唯一的方法。在一个模块(即单例)中创建一个类(用于创建多个实例)的唯一实例(即单例)。单例原则在JavaScript中是毫无意义的。你想要一个单一的对象吗?只需创建一个对象。@我知道我的代码还不完善。说这很糟糕不是很好。我以“c#”的方式上了一节单人课。因为我有它的属性和影响这些属性的方法。因此,我认为模块/名称空间不是合适的类型。你能更详细地解释一下
模块
名称空间
的区别吗?还有你关于
导出=
的那句话,我就是不明白。关于我们应该如何使用
导出
,我建议。然后,阅读
导出=
部分
export=
不是标准的一部分,它是TypeScript中旧的CommonJS/AMD方式。关于您使用的关键字
模块
,它已被
命名空间
替换,以便与标准保持一致(请参阅)。名称空间是使用旧IIFE模式的一种类型脚本方式。另请参阅:@Paleol感谢您提供的精确性和链接。我马上读!这不允许向实例传递任何参数。
From othermodule.js
[ 'New OtherModule Node' ]
From app.js
[ 'New OtherModule Node', 'New Node' ]