打字稿类变空

时间:2017-03-31 18:25:33

标签: javascript typescript

鉴于typescript中的特定设置,我最终在运行时使用javascript中的空类对象。设置只是2个引用彼此的类将等于其中一个在另一个范围内为空。我知道如何避免它(通过在2之间引入第三类)但我很好奇它为什么会发生并且还有一种方法仍然可以使这些交叉引用仍然有一个工作代码。我尝试了大量的设置,试图让它工作,所以这就是我找到的。

设置:每个类都在自己的模块中(模块名称和类名无关) ClassA是我们的主要参赛作品:

// ClassA

import ClassB = require('ClassB');
import ClassC = require('ClassC');

class ClassA
{
    constructor()
    {
        console.log(ClassC.TEST);// shows 1
        new ClassB();// shows null
        console.log(ClassC.TEST);// shows 1
    }
}
export = ClassA;

// ClassB(在不同的模块中)

import ClassC = require('ClassC');

class ClassB
{
    public static ClassBRef:any;

    constructor()
    {
        console.log(ClassC.TEST);// in this scope ClassC is an empty object with no properties
    }
}
export = ClassB;

// ClassC(在不同的模块中)

import ClassB = require('ClassB');

class ClassC
{
    public static TEST:number = 1;

    constructor()
    {
        ClassB.ClassBRef;
    }
}
export = ClassC;

因为ClassB引用ClassC和ClassC引用ClassB,结果是:ClassA范围内的ClassC没有问题,但在ClassB范围内,ClassC在运行时是一个没有属性的空对象。换句话说,在打字稿中一切都很好,但javascript不会有它。更改模块名称,位置,类名,使用静态或实例范围,在构造函数或实例方法或静态方法等中没有任何区别,ClassC在ClassB范围内始终为空。

就像我说的那样,修复是让第三个类处理与2个错误类的通信(所以这两个类中至少有一个没有引用第二个类)但我的问题是,如何在不需要的情况下完成第三类并没有删除两个类之间的交叉引用?

2 个答案:

答案 0 :(得分:0)

ClassBClassC之间有循环引用。在任何JavaScript环境中,解决这些问题都非常困难。

你基本上有两种情况。

ClassBrequire d。 ClassCrequire d。 ClassC尝试require ClassB

在这种情况下,由于ClassB仍在构建(它没有导出任何东西),因此它将是未定义的。如果首先加载ClassC,则可能发生相反的情况。

有一种方法可以解决它,没有额外的文件,但它“感觉”错了。

import containerC = require('ClassC');
// or import * as containerC from 'ClassC'; in ES6 syntax

export class ClassB
{
    public static ClassBRef:any;

    constructor()
    {
        console.log(containerC.ClassC.TEST);// in this scope ClassC is an empty object with no properties
    }
}

// ClassC
import containerB = require('ClassB');

export class ClassC
{
    public static TEST:number = 1;

    constructor()
    {
        containerB.ClassB.ClassBRef;
    }
}

这是可能的,因为require返回的值将在任一类的constructor运行时填充。

您不能使用export = X语法,必须使用指定的导出语法。在模块加载之前,您也无法尝试访问任何一个类。所以它必须在导出类之后调用的构造函数或函数中。

答案 1 :(得分:0)

使用语法 import { ClassC } from "./ClassC";用于导入类,而不是import ClassC = require('ClassC');

B组:

import { ClassC } from "./ClassC"; // use this syntax

class ClassB
{
    public static ClassBRef:any;

    constructor()
    {
        console.log(ClassC.TEST);
    }
}
export { ClassB };

C类:

import { ClassB } from "./ClassB"; // use this syntax

class ClassC
{
    public static TEST:number = 1;

    constructor()
    {
        ClassB.ClassBRef;
    }
}

export { ClassC };