我正在尝试使用两个ngx模块阵列并将它们导出为单个阵列。类似于以下内容:
@NgModule({
declarations: [],
exports: [
CommonModule, FormsModule, ReactiveFormsModule
].concat([
MatButtonModule,
MatMenuModule,
MatSidenavModule
])
})
export class CoreModule {}
为什么这不起作用?我认为,在引擎盖下,.concat
只是将地址指针组合成一个新数组,但我得到的打字稿投诉似乎表明数组指向的是什么类型的事情才能让.concat
工作。
注意:除了打字稿错误之外,我还遇到了运行时错误,例如“'mat-sidenav-container'不是已知元素”。
让我用一个简单的例子来解释这个问题:
[1, 2].concat([3, "4"])
你会收到一个错误说
(string|number)[]
类型的参数不能分配给number | ConcatArray<number>
类型的参数
所以,这意味着什么基本上,concat
期望参数只是一个数字数组,因为你引入了一个数组,[1, 2]
,TypeScript首先解释为数字数组。
然而,这将起作用,因为基本数组现在是number|string
类型,因此concat
接受number|string
类型的参数。
[1, "2"].concat([3, "4"])
我希望能清楚地解释你的问题。所以要解决你的问题,你可以尝试这样的事情:
exports: new Array<any>().concat([
CommonModule, FormsModule, ReactiveFormsModule
]).concat([
MatButtonModule,
MatMenuModule
])
在这种情况下,基本数组是new Array<any>()
并接受any
类型参数。
或者你也可以这样做:
exports: ([
CommonModule, FormsModule, ReactiveFormsModule
] as any[]).concat([
MatButtonModule,
MatMenuModule
])
最后但同样重要的是:TypeScript是一种安全机制,一种驾驶助手。有时它可能会不必要地烦人,但你可以根据你想要实现的目标欺骗系统。例如,以下语法通常是无效的[1, 2, 3] * 4
,但你仍然可以解释它,就像这个([1, 2, 3] as any) * 4
;但结果将是NaN
,几乎没有用。
你应该写这个,
const others: any[] = [
MatButtonModule,
MatMenuModule
];
然后使用...
@NgModule({
declarations: [],
exports: [
CommonModule, FormsModule, ReactiveFormsModule
].concat(...others)
})