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

mon*_*nef 24 typescript

我来自TSLint:

Multiple imports from 'moment' can be combined into one.
Run Code Online (Sandbox Code Playgroud)

有罪的代码:

import * as moment from 'moment';
import { Moment } from 'moment';
Run Code Online (Sandbox Code Playgroud)

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

import * as moment, { Moment } from 'moment';
import { * as moment, Moment } from 'moment';
import { * as moment, Moment as Moment } from 'moment';
Run Code Online (Sandbox Code Playgroud)

小智 12

小心,因为:

import * as moment from 'moment'
Run Code Online (Sandbox Code Playgroud)

不同于

import moment from 'moment'
Run Code Online (Sandbox Code Playgroud)

因为第二个只导入命名空间时刻和内部的所有内容,但是第一个导入包括函数moment()的所有东西都在命名空间之外.正确导入可以是:

import * as moment from 'moment';
type Moment = moment.Moment;
Run Code Online (Sandbox Code Playgroud)


knu*_*hol 7

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

在此特定示例中:

import * as moment from 'moment';
Run Code Online (Sandbox Code Playgroud)

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

注意

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

编辑

正如我在第一条评论中所写的那样,这种ES6方式也应该有效,并且确实有效:

import moment, { Moment } from 'moment';
Run Code Online (Sandbox Code Playgroud)

它已在1.8版本的TS中添加(请参阅发行说明)。

诸如SystemJS之类的模块加载器会包装CommonJS模块,然后将其公开为默认的ES6导入。这使得无法在模块的SystemJS和CommonJS实现之间共享定义文件,因为模块形状因加载程序而异。

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

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


Eye*_*Eye 7

以下并不总是有效。这一切都取决于是否someModuledefault出口定义。如果是,那么它将起作用。

import someModule, { someMember } from 'someModule';
Run Code Online (Sandbox Code Playgroud)

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

import * as someModule from 'someModule';
// To avoid multiple imports from the same module, destruct the exported members from the module.
const { someMember } = someModule;
Run Code Online (Sandbox Code Playgroud)