【问题标题】:Type hints of lazy loaded modules延迟加载模块的类型提示
【发布时间】:2019-07-15 10:15:43
【问题描述】:

angular 中,我想延迟加载一些模块,例如amcharts。 我知道该怎么做,但是编辑器中的类型提示呢?

这是我的代码:

import {AfterViewInit, Component, NgZone, OnInit} from '@angular/core';
// import * as am4core from '@amcharts/amcharts4/core';
// import * as am4charts from '@amcharts/amcharts4/charts';
// import am4themes_animated from '@amcharts/amcharts4/themes/animated';

@Component({
  selector: 'app-wykres',
  templateUrl: './wykres.component.html',
})
export class WykresComponent implements OnInit, AfterViewInit {
  private am4core: any;
  private am4charts: any;
  private am4themesAnimated: any;
  chart: any;


  constructor(private zone: NgZone) {
  }

  ngOnInit() {
  }

  ngAfterViewInit() {
    this.zone.runOutsideAngular(() => {
      this.loadAmcharts()
        .then(() => {
          console.log('loaded', this.am4charts, this.am4themesAnimated, this.am4core);

          this.am4core.useTheme(this.am4themesAnimated);

          let chart = this.am4core.create('chartdiv', this.am4charts.XYChart);

          chart.paddingRight = 20;

          let data = [];
          let visits = 10;
          for (let i = 1; i < 366; i++) {
            visits += Math.round(
              (Math.random() < 0.5 ? 1 : -1) * Math.random() * 10
            );
            data.push({
              date: new Date(2018, 0, i),
              name: 'name' + i,
              value: visits
            });
          }

          chart.data = data;

          let dateAxis = chart.xAxes.push(new this.am4charts.DateAxis());
          dateAxis.renderer.grid.template.location = 0;

          let valueAxis = chart.yAxes.push(new this.am4charts.ValueAxis());
          valueAxis.tooltip.disabled = true;
          valueAxis.renderer.minWidth = 35;

          let series = chart.series.push(new this.am4charts.LineSeries());
          series.dataFields.dateX = 'date';
          series.dataFields.valueY = 'value';

          series.tooltipText = '{valueY.value}';
          chart.cursor = new this.am4charts.XYCursor();

          let scrollbarX = new this.am4charts.XYChartScrollbar();
          scrollbarX.series.push(series);
          chart.scrollbarX = scrollbarX;

          this.chart = chart;
        });
    });
  }

  private async loadAmcharts(): Promise<any> {
    this.am4core = await import('@amcharts/amcharts4/core');
    this.am4charts = await import('@amcharts/amcharts4/charts');
    this.am4themesAnimated = await import('@amcharts/amcharts4/themes/animated').then(resp => {
      return resp.default;
    });
  }
}

loadAmcharts 我正在加载模块并将它们分配给属性。但这些都是任何类型的。

如果我评论:

import * as am4core from '@amcharts/amcharts4/core';
import * as am4charts from '@amcharts/amcharts4/charts';
import am4themes_animated from '@amcharts/amcharts4/themes/animated';

amchart 在主包中。 我可以延迟加载模块并在编辑器中有类型提示吗?

【问题讨论】:

    标签: angular typescript webpack lazy-loading


    【解决方案1】:

    这是个好问题。

    这更像是一个 TypeScript/IDE 问题,例如我能够找到这个issue,它描述了提示静态/动态导入之间的区别:

    静态:

    [...] .d.ts 文件是运行时存在的静态表示,可以从 TypeScript 代码生成,也可以为非 TS 编写的库手动编写。

    动态:

    并不是所有的事情都可以被推断出来——捕捉精确的行为需要真正地运行你的程序。

    那么我们如何在编码时强制 TS 知道我们的类型是什么? TypeScript 2.9 introduced a feature "import types",仅适用于您的 IDE,以下是它在您的情况下的工作方式:

      private am4core: typeof import ('@amcharts/amcharts4/core');
      private am4charts: typeof import ('@amcharts/amcharts4/charts');
      private am4themesAnimated: typeof import ('@amcharts/amcharts4/themes/animated').default;
    

    现在你应该得到代码提示了:

        const core = this.am4core;
        const charts = this.am4charts;
        const animatedTheme = this.am4themesAnimated;
    
        console.log('loaded', core, charts, animatedTheme);
    
        core.useTheme(animatedTheme);
    
        const chart = core.create('chartdiv', charts.XYChart);
    

    截图(我用的是 VS Code):

    希望这会有所帮助!

    【讨论】:

    • 感谢 anwser - 我认为我正在使用的 webStorm 不支持它:/
    • 这是可能的。我没有使用过网络风暴(短暂尝试过)。去年年底,我从 Atom 切换到 VS Code。我能够获得几乎所有我精心选择的功能,甚至自己定制了一些功能。如果你不依赖 webStorm,试试 VS Code。
    • 您可能已经设置好了,但这里有一个关于 TypeScript support in WebStorm 的页面。想知道它是否会有所帮助。请记住,此功能在 TS 2.9+ 中。
    猜你喜欢
    • 2018-05-22
    • 2018-04-17
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2020-07-08
    相关资源
    最近更新 更多