构建 Angular 6 库时为导出符号生成的元数据中遇到错误

Posted

技术标签:

【中文标题】构建 Angular 6 库时为导出符号生成的元数据中遇到错误【英文标题】:Error encountered in metadata generated for exported symbol when constructing an angular 6 library 【发布时间】:2018-10-17 18:41:38 【问题描述】:

我在从我的库中执行“ng build”时遇到以下错误。

我目前正在使用 Angular 6,但我认为此错误与版本无关。

/home/rafaelvicio/desenv/my-lib/arquitetura-web/projects/pf-siseg/src/lib/keycloak-service/keycloak.service.ts:13:1: 为导出的符号生成的元数据中遇到错误 'KeycloakService': /home/rafaelvicio/desenv/my-lib/arquitetura-web/projects/pf-siseg/src/lib/keycloak-service/keycloak.service.ts:18:12: 收集的元数据包含将在运行时报告的错误: 只能引用已初始化的变量和常量,因为 模板编译器需要此变量的值。 "__symbolic":"error","message":"变量不是 已初始化","line":17,"character":11 错误: /home/rafaelvicio/desenv/my-lib/arquitetura-web/projects/pf-siseg/src/lib/keycloak-service/keycloak.service.ts:13:1: 为导出的符号生成的元数据中遇到错误 'KeycloakService': /home/rafaelvicio/desenv/my-lib/arquitetura-web/projects/pf-siseg/src/lib/keycloak-service/keycloak.service.ts:18:12: 收集的元数据包含将在运行时报告的错误: 只能引用已初始化的变量和常量,因为 模板编译器需要此变量的值。 "__symbolic":"error","message":"变量不是 初始化","行":17,"字符":11 在/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/metadata/collector.js:707:31 在 Array.forEach () 在 validateMetadata (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/metadata/collector.js:695:46) 在 MetadataCollector.getMetadata (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/metadata/collector.js:550:21) 在 MetadataCache.getMetadata (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/transformers/metadata_cache.js:86:41) 在 Object.getSourceFileMetadata (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/transformers/compiler_host.js:112:56) 在 Object.readMetadata (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/transformers/metadata_reader.js:46:37) 在 TsCompilerAotCompilerTypeCheckHostAdapter.getMetadataFor (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler-cli/src/transformers/compiler_host.js:464:38) 在 StaticSymbolResolver.getModuleMetadata (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler/src/aot/static_symbol_resolver.js:480:49) 在 StaticSymbolResolver._createSymbolsOf (/home/rafaelvicio/desenv/my-lib/arquitetura-web/node_modules/@angular/compiler/src/aot/static_symbol_resolver.js:268:33)

keycloak.service.ts:

import  Injectable  from '@angular/core';
import  KeycloakLoginOptions  from './keycloak.d';

import  HttpClient  from '@angular/common/http';
import  Observable  from 'rxjs/Observable';

import * as Keycloak from './keycloak';

export type KeycloakClient = Keycloak.KeycloakInstance;
type InitOptions = Keycloak.KeycloakInitOptions;

@Injectable()
export class KeycloakService 

    constructor(private http: HttpClient)  

    static keycloakAuth: KeycloakClient;

.... More code here

【问题讨论】:

【参考方案1】:

在声明静态方法的类前添加// @dynamic

【讨论】:

很高兴知道为什么这可以解决问题 对我来说,这与static 方法有关。添加// @dynamic 即可解决。【参考方案2】:

我今天在一个提供静态方法作为助手的util 类中遇到了这个问题。

我通过将this 替换为ObjectUtils(类名本身)解决了这个问题,并且它有效。

正如@NicolasThierion 在@stack247 评论的reply 中提到的那样,您也可以尝试以下技巧

// @dynamic
export class SomeClass 
    public static get()  return 'someValue';  

【讨论】:

【参考方案3】:

我正在使用 Angular V8 并且遇到了同样的问题。 Angular 不允许不初始化静态变量。解决方案是用 null 初始化以避免错误。

@Injectable()
export class ExampleService 

    static URL: string = null;
...

【讨论】:

当它指向的“变量”是一个getter函数时,这不起作用! 谢谢,它的工作。只需添加默认值,可能为 null。【参考方案4】:

我的经验是在方法的构造函数中错误地使用了静态值。通过this.STATIC_VALUE而不是Foo.STATIC_VALUE引用静态值。

class Foo 
  static STATIC_VALUE = 'hi';

  constructor(
    private bar: string
  ) 

  static defoo(): Foo 
    return Foo(this.STATIC_VALUE);
  

defoo 方法应该是

  static defoo(): Foo 
    return Foo(Foo.STATIC_VALUE);
  

【讨论】:

【参考方案5】:

我遇到了同样的问题,通过从变量中删除“静态”解决了这个问题。

【讨论】:

删除 static 从根本上改变了您使用变量的方式/位置的性质。

以上是关于构建 Angular 6 库时为导出符号生成的元数据中遇到错误的主要内容,如果未能解决你的问题,请参考以下文章

如何防止静态库中的所有符号加载以及为什么在链接静态库时导出相同.o文件中的其他符号进行测试

设关系R和关系S的元数(基数)分别是r和s,关系T是R与S的广义笛卡尔积,即:T=R× S,则关系T的元数(基数)是

如何防止 ReSharper 在生成代码时为内置类型添加“@”符号?

带有普通 TypeScript 的 Angular 6 - 错误:模块没有导出的成员

构建角度库时包含资产

当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?