2017-08-14 65 views
1

我从TSLint获得:如何将导入全部与其他导入器结合使用?

Multiple imports from 'moment' can be combined into one. 

有罪代码:

import * as moment from 'moment'; 
import { Moment } from 'moment'; 

我尝试了好几种变种没有成功(我没有找到文档相关的例子):

import * as moment, { Moment } from 'moment'; 
import { * as moment, Moment } from 'moment'; 
import { * as moment, Moment as Moment } from 'moment'; 
+0

我不知道TS,但在ES 6,你可以去只是'进口时刻,从“时刻” {时刻};'(也许它会为TS以及工作)。 –

+1

'从*时刻开始'输入*时刻;'是正确的。但只有那:)然后用'moment.Moment'等方式访问所有东西。 – Wernerson

+0

@Wernerson我认为它可以像这样修改,但是当TSLint说它可以合并为一个导入时,我认为这意味着“合并为一个导入而没有修改其他任何东西“。 – monnef

回答

0

如果您在导入中使用星号,则可以通过名称为as的名称访问导入模块中的所有内容以获取星号。

在这个特殊的例子:

import * as moment from 'moment'; 

你并不需要导入{ Moment }以及因为你可以简单地在你的代码中访问Moment通过moment.Moment

注意

你不能用任何其他进口联合星号进口,是的,在这个特殊的情况下,TSLint消息是有点误导。

编辑

正如我在我的第一个评论中写道,这一ES6方式应该工作以及和它确实有效:

import moment, { Moment } from 'moment'; 

它被添加到TS 1.8版本(见release notes) 。

模块装载机等SystemJS包裹CommonJS的模块,然后暴露作为 默认ES6导入。由于基于加载程序的模块形状看起来不同,因此无法在模块 的SystemJS和CommonJS实现之间共享定义 文件。

设置新的编译器标志--allowSyntheticDefaultImports指示 模块加载器执行某种合成默认导入 未在导入的.ts或.d.ts中指示的成员创建。 编译器将推断存在具有整个模块本身的 形状的默认导出。

默认情况下,系统模块具有此标志。

+0

我的理解是正确的 - linter错误是错误的,它不能被合并为一个导入而不触及代码的其余部分? – monnef

+0

@monnef排序,我仍然相信'从'时刻'输入时刻,{瞬间};'应该可以工作,但这肯定会奏效。另一方面,你不能将星号导入与其他任何东西结合起来,是的,在这种特殊情况下,TSLint消息有点误导。 –

0

在Typescript中,您可以从一个文件中导出多个函数,类和变量。在大多数情况下,你只是想喜欢进口的一些特别的事情:

import { Component } from "@angular/core";

瞬间建有一点点不同,所以你通常导入它是这样的:

import * as moment from "moment";

这也可以用于角度导入:

import * as AngularCore from "@angular/core"; 

@AngularCore.Component({ 
    //... 

这是相同的技术。在第二种方法中,您只需将ALL导出到名为AngularCore(或时刻)的变量。这现在就像一个包装。你能想象它像一个Javascript对象:

var AngularCore = { 
    Component: // the component things.... 
    OnInit: // the OnInit interface... 
} 

little fancy paint grahpic

在这里你可以看到更多或更少的它是如何工作的。 (对不起,油漆技巧:/)

变量(在示例时刻)可以有任何你喜欢的名字。

我希望你能理解这一点。如果不只是问。

0

你只是这样做:

import moment, {Moment} from 'moment'; 

tsconfig.json你应该有allowSyntheticDefaultImports设置为true为打字稿1.8的(它的默认值是true)。

+0

我试过这个不同的模块,但'import xyz,{rest}'只有在默认导出和'import *为xyz,{rest}'是语法错误时才有效。 –

+0

正确,这只有在有默认导出时才有效。 – gilamran

3

要小心,因为:

import * as moment from 'moment' 

import moment from 'moment' 

不同,因为第二只导入命名空间瞬间和内的一切,但是第一进口一切,包括功能力矩()超出了命名空间。 正确输入可以是:

import * as moment from 'moment'; 
type Moment = moment.Moment;