如何在Typescript

时间:2017-02-21 13:13:19

标签: typescript systemjs javascript-namespaces

我在理解如何使用相同的命名空间制作两个文件并在Typescript中将一个文件导入另一个文件时遇到了问题。

情况就是这样:

file1.ts

export namespace nspace {
    export class ClassA {

    }
}

file2.ts

import {nspace} from './file1';

export namespace nspace {
    export class ClassB extends nspace.ClassA {
        private z: nspace.ClassA;
    }
}

在file2中我有这些错误:

1)合并声明'nspace'中的个别声明必须全部导出或全部导出

2)属性'ClassA'在'typeof nspace'

类型上不存在

最重要的是,当用于声明z字段的类型时,可以正确找到ClassA(如果我在IDE中使用“转到声明”,它甚至会将我带到正确的文件中)
我已经尝试在互联网上搜索第一个错误,因为我真的不明白这意味着什么,但我找不到的页面都没有帮助。我在稿件中阅读了有关声明合并的文档,但我找不到类似于我的情况 我不知道这是否有任何帮助,但我在我的应用程序中使用SystemJS

2 个答案:

答案 0 :(得分:2)

使用起来应该简单得多:

ClassA.ts
namespace MyApp {
    export class ClassA {
        public a: string = "classA";
    }
}
ClassB.ts
namespace MyApp {
    export class ClassB extends ClassA {
        private class_a: ClassA = new ClassA();
        private b: string = "classB";
    }
}
main.ts
namespace MyApp {
  var b = new ClassB();
  console.log(b.class_a.a) // "classA"
}

编译器将识别出您在同一名称空间中工作,因此不需要import它,甚至不需要它前缀。

可能需要添加对ClassB.ts文件顶部的引用,如下所示: /// <reference path="ClassA.ts" />

虽然在我的设置中,我没有必要这样做,编译器似乎自动正确选择。 (我在tsconfig.json中使用了一个OutFile和exclude指令)

边注:

我觉得奇怪的是你被迫导出ClassA以便在我的ClassB.ts中发现它。如果我想在Main.ts中使用它们(即使在私有变量中),似乎不可能将ClassA和ClassB保持为命名空间。它只是错误的&#34;找不到名字......&#34;

答案 1 :(得分:1)

显然,在导入工作时给出另一个名称:

文件1

export namespace nspace {
    export class ClassA {

    }
}

file2的

import * as a from './file1';

export namespace nspace {
    export class ClassB extends a.nspace.ClassA {
        private  b: a.nspace.ClassA;

    }
}