Angular / Typescript class.name 在生产版本中不起作用

use*_*924 5 javascript angularjs typescript angular5

使用 Angular 5。面对 class.name 属性的奇怪问题。我们在打字稿中有以下功能:

export class ApiService
{
  public list<T>(c: new(values: Object)=> T)
  {
    var cname = c.name;
    ....
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我在 Angular (ng-build) 的开发版本中使用这个函数,如下所示:

export class Employee()
{
    public id:string;
    public name: string;

    constructor(values: Object = {}) {          
       Object.assign(this, values);          
    }
}
Run Code Online (Sandbox Code Playgroud)

在某处的代码中:

var list = api.list(Employee);
Run Code Online (Sandbox Code Playgroud)

以上有效,在列表函数中我得到 cname = 'Employee'

但是,如果我们使用 ng build --env=prod 构建此解决方案,代码将失败并且我们得到 cname = undefined。

为什么会发生这种情况,如何解决?在开发构建中编译和工作的东西不应该在生产中工作吗?

Nat*_*end 2

您可能会遇到缩小问题,该问题仅在prod构建期间发生。缩小将重命名您的类,以获得最小的输出文件大小。

请参阅此问题和答案以获取相关讨论:Angular-cli:如何忽略类名被缩小

正如上面的答案提到的,为了配置此选项,您将需要ng eject您的应用程序,它将允许您自定义 UglifyJS 选项(负责缩小的库),但这也会阻止您使用 Angular 的一些不错的功能CLI(如ng build和ng serve)。

请参阅此 GitHub 评论以获取描述ng eject:https://github.com/angular/angular-cli/issues/6302#issuecomment-301220770