构建 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 在生成代码时为内置类型添加“@”符号?