如何在 Typescript 的两个不同文件中正确导入相同的命名空间
How to correctly import the same namespace in two different files in Typescript
我在理解如何在 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;
}
}
在文件 2 中我有这些错误:
1) 合并声明中的单独声明'nspace'必须全部导出或全部本地
2) 属性 'ClassA' 在类型 'typeof nspace'
上不存在
最重要的是,当用于声明 z
字段的类型时,可以正确找到 ClassA(如果我在我的 [=37] 中使用 "go to declaration",它甚至会把我带到正确的文件=])
我尝试在互联网上搜索第一个错误,因为我不太明白它的意思,但我找到的 none 页面有帮助。我阅读了有关 Typescript 中的 Declaration Merging 的文档,但我找不到与我的类似的情况
我不知道这是否有帮助,但我在我的应用程序中使用 SystemJS
使用起来应该会简单很多:
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 和排除指令)
边注:
我觉得奇怪的是你被迫导出 ClassA
以便在我的 ClassB.ts 中发现它。如果我想在 Main.ts 中使用它们(即使在私有变量中),似乎不可能将 ClassA 和 ClassB 保留在命名空间中。它只是错误 "Can not find name..."
显然,导入时给另一个名字有效:
文件 1
export namespace nspace {
export class ClassA {
}
}
文件2
import * as a from './file1';
export namespace nspace {
export class ClassB extends a.nspace.ClassA {
private b: a.nspace.ClassA;
}
}
我在理解如何在 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;
}
}
在文件 2 中我有这些错误:
1) 合并声明中的单独声明'nspace'必须全部导出或全部本地
2) 属性 'ClassA' 在类型 'typeof nspace'
上不存在最重要的是,当用于声明 z
字段的类型时,可以正确找到 ClassA(如果我在我的 [=37] 中使用 "go to declaration",它甚至会把我带到正确的文件=])
我尝试在互联网上搜索第一个错误,因为我不太明白它的意思,但我找到的 none 页面有帮助。我阅读了有关 Typescript 中的 Declaration Merging 的文档,但我找不到与我的类似的情况
我不知道这是否有帮助,但我在我的应用程序中使用 SystemJS
使用起来应该会简单很多:
ClassA.tsnamespace 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
它,甚至不需要前缀。
/// <reference path="ClassA.ts" />
尽管在我的设置中,我不必执行此操作,但编译器似乎会自动正确地进行处理。 (我在 tsconfig.json 中使用单个 OutFile 和排除指令)
边注:我觉得奇怪的是你被迫导出 ClassA
以便在我的 ClassB.ts 中发现它。如果我想在 Main.ts 中使用它们(即使在私有变量中),似乎不可能将 ClassA 和 ClassB 保留在命名空间中。它只是错误 "Can not find name..."
显然,导入时给另一个名字有效:
文件 1
export namespace nspace {
export class ClassA {
}
}
文件2
import * as a from './file1';
export namespace nspace {
export class ClassB extends a.nspace.ClassA {
private b: a.nspace.ClassA;
}
}