在Angular项目中,我使用TypeLITE为来自后端的对象自动生成一堆接口。这部分运作良好,我对物体具有智能感知,并且对某些物体(某种程度上)具有类型安全性。从TypeLITE在Angular项目中生成的多级别名称空间导入TypeScript enum
但是现在我遇到了包含枚举的第一个类,TypeLITE正确拾取并在enums.ts中创建了TypeScript代码。这两个文件的内容是这样的:
classes.d.ts
declare namespace My.Multi.Level.Namespace {
interface MyInterface {
Status: My.Multi.Level.Namespace.Status;
}
}
enums.ts
namespace My.Multi.Level.Namespace {
export const enum Status {
Undefined = 0,
New = 1,
...
}
}
someOtherFile.ts
// How/what to import to access this?
const status = My.Multi.Level.Namespace.New;
而引用该枚举的“classes.d.ts”中的实际接口仍然正常工作。
但现在我尝试导入该名称空间以在运行时访问“状态”枚举,并且无法弄清楚如何执行该操作。无论我做什么,命名空间都不可用。
我试着将它改为“导出命名空间...”或者甚至是“导出模块...”,但是会破坏在“classes.d.ts”中生成的代码。我需要一个解决方案,它允许我在运行时使用enum以及完整地保留类的连接。
我知道在模块和命名空间中存在一些不兼容性,但我只是假设有一些方法可以解决它并实际使用这些枚举?
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");
}
}
3)添加此文件classes.ts
// classes part
namespace My.Multi.Level.Namespace {
export interface MyInterface {
Title: string;
Status: My.Multi.Level.Namespace.Status;
}
}
namespace My.Other.Multi.Level.Namespace {
export interface SomeInterface {
Context: My.Multi.Level.Namespace.MyInterface[];
}
}
// enums part
namespace My.Multi.Level.Namespace {
export const enum Status {
Undefined = 0,
New = 1
}
}
export import My = My;
预期行为: “1” 将在显示的页面(枚举的值),它仍然编译为所有引用仍然完好(如My.Other.Multi.Level.Namespace.SomeInterface.Context仍然合作连接到My.Multi.Level.Namespace.MyInterface [])。
缺少的部分是'namespace'之前的'export'。那么你可以'从我的导入{我}}“..' –
我很确定我尝试过,但我认为这不起作用,因为多级命名空间?无论如何,明天再试一次,谢谢! – Marc
啊,现在我记住,虽然添加“导出”将解决无法导入枚举(可以正常导出)的问题,但它会打破使用此枚举的“classes.d.ts”的链接(编译器显示为“classes.d.ts (40,53):命名空间'My.Multi.Level.Namespace'没有导出成员'MyEnum'。“) – Marc