打字稿导入别名+桶文件

时间:2019-04-05 14:09:19

标签: angular typescript ngrx

最近,我花了很多时间,因为在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

但是...为什么?

我误解了此过程的任何部分吗?

我不确定这是否重要,但是注册效果的功能是延迟加载的。

1 个答案:

答案 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干扰类型,我很确定它会向您显示您丢失的错误。