Angular 从项目中TypeLITE生成的多级命名空间导入TypeScript枚举
在Angular项目中,我使用TypeLITE为来自后端的对象自动生成一组接口。这部分工作得很好,我对对象有智能感知,对那些对象(在某种程度上)有类型安全 但是现在我遇到了第一个类,它包含一个enum,TypeLITE可以正确地拾取并在enums.ts中创建TypeScript代码。这两个文件的内容如下所示: classes.d.tsAngular 从项目中TypeLITE生成的多级命名空间导入TypeScript枚举,angular,typescript,webpack,typelite,Angular,Typescript,Webpack,Typelite,在Angular项目中,我使用TypeLITE为来自后端的对象自动生成一组接口。这部分工作得很好,我对对象有智能感知,对那些对象(在某种程度上)有类型安全 但是现在我遇到了第一个类,它包含一个enum,TypeLITE可以正确地拾取并在enums.ts中创建TypeScript代码。这两个文件的内容如下所示: classes.d.ts declare namespace My.Multi.Level.Namespace { interface MyInterface { Status
declare namespace My.Multi.Level.Namespace {
interface MyInterface {
Status: My.Multi.Level.Namespace.Status;
}
}
namespace My.Multi.Level.Namespace {
export const enum Status {
Undefined = 0,
New = 1,
...
}
}
// How/what to import to access this?
const status = My.Multi.Level.Namespace.New;
enums.ts
declare namespace My.Multi.Level.Namespace {
interface MyInterface {
Status: My.Multi.Level.Namespace.Status;
}
}
namespace My.Multi.Level.Namespace {
export const enum Status {
Undefined = 0,
New = 1,
...
}
}
// How/what to import to access this?
const status = My.Multi.Level.Namespace.New;
someOtherFile.ts
declare namespace My.Multi.Level.Namespace {
interface MyInterface {
Status: My.Multi.Level.Namespace.Status;
}
}
namespace My.Multi.Level.Namespace {
export const enum Status {
Undefined = 0,
New = 1,
...
}
}
// How/what to import to access this?
const status = My.Multi.Level.Namespace.New;
“classes.d.ts”中引用该枚举的实际接口仍然可以正常工作
但现在我尝试在运行时导入该名称空间以访问“Status”枚举,但不知道如何执行该操作。不管我做什么,名称空间都不可用
我尝试将其更改为“导出名称空间…”甚至“导出模块…”,但这会破坏“classes.d.ts”中生成的代码。我需要一个解决方案,使我能够在运行时使用枚举,同时保持与类的连接完好无损
我知道在模块和名称空间方面存在一些不兼容性,但我只是假设有某种方法可以绕过它并实际使用那些枚举
USED VERSION
Angular 4.3.6
TypeScript 2.3.4.
编辑:简化示例 如果您想在自己的机器上尝试我的问题,请按照以下步骤操作: 1) 创建一个新的最小角度应用程序
ng new enumtest --minimal
2) 使用以下代码修改app.component.ts
文件:
import { Component, OnInit } from '@angular/core';
import { My } from './classes';
@Component({
selector: 'app-root',
template: `<p>{{myEnum}}</p>`
})
export class AppComponent implements OnInit {
myEnum: My.Multi.Level.Namespace.Status;
ngOnInit() {
console.log("ngOnInit:begin:myEnum");
this.myEnum = My.Multi.Level.Namespace.Status.New;
console.log("ngOnInit:after:myEnum");
}
}
预期行为:“1”将显示在页面上(枚举的值),并且它仍然会编译,因为所有引用仍然完整(如My.Other.Multi.Level.Namespace.SomeInterface.Context仍然连接到My.Multi.Level.Namespace.MyInterface[])。as@Aleksey L。您提到需要导出
名称空间,它只适用于一个文件,但问题是,无论何时在顶层导出,Typescript都会开始假定该文件是一个模块(这是有充分理由的)
名称空间
at-Typescript的发明是为了模拟假定位于全局上的文件中的模块行为
您几乎没有选择:
如果您不需要全局名称空间,那么可以去掉它,直接从每个文件导出enum/接口
如果您确实需要名称空间,那么应该将其导出,并且假设它的所有内容都写入同一个文件中,因此枚举和接口将位于同一个文件中
事实上,在我的工作中,我们曾经大量使用名称空间(当我们所有的代码库都在全局上声明时),然后每当我们在构建系统中引入Webpack时,我们就开始将代码转换为使用ES6模块,其中一个步骤就是删除名称空间
我们需要逐步进行转换,因此一些代码使用名称空间
,一些ES6模块
。
为了保持向后兼容性,我们保留了包含名称空间的文件,并为每个文件创建了一个新文件,从全局文件中读取名称空间并将其导出
诸如此类:
// old-file.ts
namespace someName {
export class SomeClass {
}
}
//old-file.es6.ts
export import SomeClass = someName.SomeClass;
希望有帮助。缺少的部分是导出之前的名称空间。然后你可以import{My}from..
我很肯定我试过了,但我认为由于多级名称空间的原因,这不起作用?无论如何,明天我会再试一次,谢谢!啊,现在我记起来了。虽然添加“export”可以解决我无法导入枚举的问题(使用export很好),但它会断开“classes.d.ts”的链接使用此枚举的(编译器说“classes.d.ts(40,53):名称空间'My.Multi.Level.Namespace'没有导出的成员'MyEnum'”),所以添加import{My}from./enums'很遗憾,classes.d.ts中的code>也不起作用,那么classes.d.ts就不再起作用了,因为交叉引用的成员正在抛出错误,如[ts]名称空间的“c:/src/enums”。My“没有导出的成员”子类。
谢谢您的回复。不幸的是,这也不起作用,也许我遗漏了一些东西。我无法更改名称空间,因为这些名称空间来自一个大项目,删除或重命名它们是不可能的。我尝试了您的建议,将其放入一个文件(因此我不再使用.d声明)和导出导入,但枚举在运行时仍然不可用。将用另一个简化的示例更新我的问题。