Typescript - 我可以互相引用类吗?

时间:2016-10-04 14:18:11

标签: typescript

我想创建两个类ParentChild,每个类都包含对另一个类型的实例的引用。在许多编译语言中,这是完全合法的。例如,在C#中,这会编译:

public class Parent {
    public Child myChild;

    public Parent() {
        myChild = new Child();
        myChild.myParent = this;
    }
}

public class Child {
    public Parent myParent;
}

但是,在TypeScript中,我无法使用它。我找到的最佳选择是创建any类型的引用之一,但这会使Child在处理Parent或其他任何其他内容时需要执行的任何静态类型检查失败成员。

class Parent {
    myChild: Child;

    constructor() {
        this.myChild = new Child();
        this.myChild.myParent = this;
    }
}

class Child {
    myParent: any;
}

在一个理想的世界中,所有对象模型都可以通过非循环图来轻松描述,但现实世界是混乱的,有时候能够以两种方式导航对象图是非常方便的。

我可以在TypeScript中获得这样的双向静态类型对象图导航吗?怎么样?

2 个答案:

答案 0 :(得分:0)

如果两个类都在同一个文件(模块)中 - 你应该没有问题。例如,以下代码可以正常工作:

class Parent
{
    public myChild: Child;

    public constructor()
    {
        this.myChild = new Child();
        this.myChild.myParent = this;
    }

    public callMe()
    {
        this.myChild.callMe();
    }

    public callMeAgain()
    {
        console.log("Parent");
    }
}

class Child
{
    public myParent: Parent;

    public callMe()
    {
        console.log("Child");
        this.myParent.callMeAgain();
    }
}

let p = new Parent();
p.callMe();

playground

更新。

不幸的是,即使使用最新的打字稿2.0.3,模块之间的交叉引用也不适用于一般情况。更复杂的交叉引用案例(将其作为example)仍然无效。由于您可以参考上一个链接和answer

的原因

答案 1 :(得分:0)

此代码使用TypeScript 2.0.2正确构建:

class Parent {
    myChild: Child;

    constructor() {
        this.myChild = new Child();
        this.myChild.myParent = this;
    }
}

class Child {
    myParent: Parent;
}