将基于角度的应用程序 (angular-cli) 从运行良好的基于 JIT 的场景转换为基于 AOT 的场景。AOT-build 运行良好。
打开生成的网页时,我收到无法读取未定义错误的属性“无”。这些错误是由未定义的枚举引起的运行时
非常简化的例子(带有 2 个单独的文件)
action-type.enum.ts(单独文件中的枚举)
export enum eActionType {
none,
actionA
...
}
test.component.ts(单独文件中的组件)
import { eActionType } from './action-type.enum';
@Component({ ... })
export class Test {
// @Runtime eActionType (eActionType.none) will be undefined
private/protected/public actionType: eActionType = eActionType.none;
}
eActionType 虽然被导入,但在 test.component.ts 中不可用。
可能的解决方案 1 - 同一文件中的枚举(不可取)
测试组件.ts
// Exported enum within same file
export enum eActionType {
none,
actionA
...
}
@Component({ ... })
export class Test {
// @Runtime eActionType is available
private/protected/public actionType: eActionType = eActionType.none;
}
如果枚举在同一个文件中声明,它将在运行时正常工作。但这是不可取的,因为与可以导入多个位置的外部文件中的枚举相比,它会失去可维护性。
可能的解决方案 2 - 具有静态属性的类而不是枚举(也不可取)
action-type.enum.ts(单独文件中的枚举)
export class eActionType {
static none = 0;
static actionA = 1;
...
}
test.component.ts(单独文件中的组件)
import { eActionType } from './action-type.enum';
@Component({ ... })
export class Test {
// @Runtime eActionType is available as static property of eActionType
private/protected/public actionType: eActionType = eActionType.none;
}
也没有真正漂亮的解决方案,但至少在所有情况下都必须更改前枚举的声明,而不是消费者代码。
如何强制在外部文件中声明的正确枚举在运行时在其他位置可访问?