Typescript 如何将所有导入与其他导入相结合?

Typescript 如何将所有导入与其他导入相结合?,typescript,Typescript,我从TSLint得到: Multiple imports from 'moment' can be combined into one. 犯罪代码: import * as moment from 'moment'; import { Moment } from 'moment'; 我尝试了几种变体,但没有成功(我在文档中没有找到相关示例): 如果在导入中使用星号,则可以使用星号的名称访问导入模块中的所有内容 在这个特定的例子中: import * as moment from 'momen

我从TSLint得到:

Multiple imports from 'moment' can be combined into one.
犯罪代码:

import * as moment from 'moment';
import { Moment } from 'moment';
我尝试了几种变体,但没有成功(我在文档中没有找到相关示例):


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

在这个特定的例子中:

import * as moment from 'moment';
您也不需要导入
{Moment}
,因为您只需通过代码中的
Moment.Moment
访问
Moment

注意

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

编辑

正如我在第一篇评论中所写的,这种ES6方法也应该有效,而且确实有效:

import moment, { Moment } from 'moment';
它是在1.8版的TS中添加的(请参阅)

像SystemJS这样的模块加载器包装CommonJS模块,然后作为 默认的ES6导入。这使得我们无法分享这个定义 模块的SystemJS和CommonJS实现之间的文件 由于模块形状因加载程序而异

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

默认情况下,系统模块启用此标志


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

从“@angular/core”导入{Component}

Moment的构建稍有不同,因此您通常按如下方式导入它:


import*作为“时刻”中的时刻

这也可用于角度导入:

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

@AngularCore.Component({
    //...
这是同样的技术。在第二种方法中,您只需将所有导出分配给一个名为AngularCore(或矩)的变量。这就像一个包装。您可以将其想象为一个Javascript对象:

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

在这里你可以或多或少地看到它是如何工作的。(为糟糕的绘画技巧感到抱歉:/)

变量(在示例中)可以有您喜欢的任何名称

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

你只需这样做:

import moment, {Moment} from 'moment';
tsconfig.json
中,从Typescript 1.8开始,您应该将
allowSyntheticDefaultImports
设置为
true
(默认情况下为true)。

请小心,因为:

import * as moment from 'moment'
不同于

import moment from 'moment'
因为第二个只导入名称空间矩和其中的所有内容,而第一个导入所有内容,包括名称空间之外的函数矩()。 正确的导入可以是:

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

下面的方法并不总是有效的。这完全取决于
someModule
是否定义了
default
导出。如果是的话,那么它就会起作用

import someModule, { someMember } from 'someModule';
我引用的模块没有定义默认值,因此我采用了以下方法:

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

我不确定TS,但在ES 6中,您可以使用
import-moment,{moment}从'moment'开始(可能也适用于TS)。
从“时刻”导入*作为时刻是正确的。但仅此:)然后使用
moment.moment
等访问所有内容。@Wernerson我认为它可以这样修改,但当TSLint说它可以合并到一个导入时,我认为它意味着“合并到一个导入而不修改任何其他内容”.我的理解是对的-linter错误是错误的,它不能在不涉及代码其余部分的情况下组合到一个导入中?@monnef,我仍然相信
import-moment,{moment}来自“moment”也应该可以工作,但这肯定会工作。另一方面,您不能将星号导入与任何其他内容结合起来,是的,在这种特殊情况下,TSLint消息有点误导。我在另一个模块中尝试了这一点,但
import xyz,{rest}
仅在有默认导出且
import*作为xyz,{rest}
是语法错误的情况下才起作用。
import * as someModule from 'someModule';
// To avoid multiple imports from the same module, destruct the exported members from the module.
const { someMember } = someModule;