Typescript 如何将所有导入与其他导入相结合?
我从TSLint得到: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
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;