如何将导入全部与其他人结合起来?

时间:2017-08-14 07:55:45

标签: typescript

我来自TSLint:

curl -XPOST "http://localhost:9200/t/t/1/_update" -d' 
{ 
   "script" : {
      "inline": "ctx._source.hobbies.add(params.hobby)", 
      "params" : { 
         "hobby" : "c" 
      } 
   }
}'

有罪代码:

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

我尝试了几种变体但没有成功(我在docs中找不到相关的例子):

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

5 个答案:

答案 0 :(得分:10)

小心,因为:

import * as moment from 'moment'

不同
import moment from 'moment'

因为第二个只导入命名空间时刻以及其中的所有内容,但是第一个导入包括函数moment()在内的所有内容都超出了命名空间。 正确导入可以是:

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

答案 1 :(得分:5)

如果您在导入时使用星号,则可以使用星号as的名称从导入的模块访问所有内容。

在这个特定的例子中:

import * as moment from 'moment';

您也不需要导入{ Moment },因为您只需在代码中Moment访问moment.Moment

注意

您不能将星号导入与任何其他导入结合使用,是的,在这种特殊情况下,TSLint消息有点误导。

修改

正如我在第一篇评论中所写的那样,这种ES6方式应该也能正常工作,它确实有效:

import moment, { Moment } from 'moment';

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

  

像SystemJS这样的模块加载器包装CommonJS模块并将其公开为   默认的ES6导入。这使得无法共享定义   SystemJS和CommonJS模块之间的文件   因为模块形状基于加载器看起来不同。

     

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

     

系统模块默认启用此标志。

答案 2 :(得分:2)

以下并不总是有效。这完全取决于someModule是否定义了default导出。如果是,那么它将起作用。

import someModule, { someMember } from 'someModule';

我引用的模块没有定义default,所以我选择了以下方法:

import * as someModule from 'someModule';
// To avoid multiple imports from the same module, destruct the exported members from the module.
const { someMember } = someModule;

答案 3 :(得分:1)

在Typescript中,您可以从一个文件中导出多个函数,类和变量。在大多数情况下,您只需要一些特殊的导入内容:

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

Moment的构建有点不同,所以你通常会像这样导入:

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

在这里你可以看到它的工作方式。 (对不起油漆技巧不好:/)

变量(在示例时刻)可以包含您喜欢的任何名称。

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

答案 4 :(得分:-1)

你这样做:

import moment, {Moment} from 'moment';

tsconfig.json中,你应该将allowSyntheticDefaultImports设置为true,因为它来自于Typescript 1.8(默认情况下它是真的)。​​