我来自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)
如果在导入中使用星号,则可以通过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中指示。编译器将推断出默认导出的存在,该默认导出具有整个模块本身的形状。
系统模块默认情况下启用此标志。
以下并不总是有效。这一切都取决于是否someModule有default出口定义。如果是,那么它将起作用。
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)
| 归档时间: |
|
| 查看次数: |
5387 次 |
| 最近记录: |