最近,我花了很多时间,因为在angular / ngrx / typescript生态系统中某种事物的特定行为(并且我无法确定可能的根本原因)。
场景:我建立了一些效果,并将它们导出到桶文件(var persons []*Person
p := &Person{name: "David"}
persons = append(persons, p)
doSomething(p)
fmt.Println(persons[0])
fmt.Println(p)
)中:
index.ts
然后,在目录结构中上一层的另一个桶文件中,我具有:
import {MyEffects} from './my.effects';
export const effects: any[] = [
MyEffects,
];
最后,在import * as EFFECTS from './effects'
export {EFFECTS};
imports数组中:
NgModule
当我尝试对此进行编译时,我得到了一条很短的错误消息:
[
...
EffectsModule.forFeature(EFFECTS.effects),
...
]
仅此而已。而且它阻止了我的项目的编译。还有更多...如果我运行ERROR in params.map is not a function
,也会发生该错误,但是,如果我在ng serve
监视文件更改时进行了任何更改,它只会成功地重新编译项目。
整天寻找可能导致它的原因后,我发现别名部分没有按照我认为的可能做。然后,我对结构进行了一些更改,现在可以按预期运行
在第一个桶文件中:
ng serve
在上层桶文件中:
import {MyEffects} from './my.effects';
export const EFFECTS: any[] = [
MyEffects,
];
在export * from './effects'
// instead of:
// import * as SOMETHING from './effects'
// export {SOMETHING};
中:
NgModel
我误解了此过程的任何部分吗?
我不确定这是否重要,但是注册效果的功能是延迟加载的。
答案 0 :(得分:0)
您正在创建一个奇怪的层次结构。
export *
和import/export
的行为方式不同。
使用export *
时,TypeScript的行为就像该文件中所有导出的符号实际上都在文件内部一样,即使它们是从其他位置导入的也是如此。换句话说,该模块只是层次结构中的一个透明级别,仅对缩短路径有用(您将能够用import {foo} from './module'
代替import {foo} from './module/src/foo
来编写)。
相反,当您使用以下内容时:
import * as smth from './path';
export {smth}
您将介绍一个前所未有的更高级别。它是smth
关键字。您不会忘记smth
键,它在那里,并且正在包装您的整个模块。
回到示例,您应该编辑问题,以显示如何在Effects
中导入NgModule
。
如果您以如下方式导入它:
import * as effects from './effects.ts';
然后,您将再次引入一个包装所有变量的新符号,因此正确的路径将是effects.effects.effects.etc
。
使用解构和export *
可以让您导入和导出变量而无需创建包装器。
现在的问题是,为什么编译器没有警告您?因为打字稿编译器通常善于捕获这些类型的问题。解决方案可能在这里:
export const effects: any[] = [
删除类型定义(any[]
)并让TypeScript干扰类型,我很确定它会向您显示您丢失的错误。