Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 从项目中TypeLITE生成的多级命名空间导入TypeScript枚举_Angular_Typescript_Webpack_Typelite - Fatal编程技术网

Angular 从项目中TypeLITE生成的多级命名空间导入TypeScript枚举

Angular 从项目中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

在Angular项目中,我使用TypeLITE为来自后端的对象自动生成一组接口。这部分工作得很好,我对对象有智能感知,对那些对象(在某种程度上)有类型安全

但是现在我遇到了第一个类,它包含一个enum,TypeLITE可以正确地拾取并在enums.ts中创建TypeScript代码。这两个文件的内容如下所示:

classes.d.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;
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就不再起作用了,因为交叉引用的成员正在抛出错误,如
    [ts]名称空间的“c:/src/enums”。My“没有导出的成员”子类。
    谢谢您的回复。不幸的是,这也不起作用,也许我遗漏了一些东西。我无法更改名称空间,因为这些名称空间来自一个大项目,删除或重命名它们是不可能的。我尝试了您的建议,将其放入一个文件(因此我不再使用.d声明)和导出导入,但枚举在运行时仍然不可用。将用另一个简化的示例更新我的问题。