如何在带有SystemJS的TypeScript中使用momentjs?

如何在带有SystemJS的TypeScript中使用momentjs?,typescript,momentjs,systemjs,Typescript,Momentjs,Systemjs,我的项目设置包括用于库的“jspm”工具和用于打字的“tsd”工具 在安装了矩的TypeScript d.ts文件()之后,我找不到加载和实际使用矩实例的方法 在我的文件中(使用SystemJS模块加载) // 从“时刻”导入*作为时刻; 从“lodash”中导入*as uu; ... ... const now=(this.timestamp==0)?矩():矩(此.timestamp); 我得到一个“TypeError:瞬间不是一个函数” 定义的结构与相同,这很好,所以我不知道原因是什么

我的项目设置包括用于库的“jspm”工具和用于打字的“tsd”工具

在安装了矩的TypeScript d.ts文件()之后,我找不到加载和实际使用矩实例的方法

在我的文件中(使用SystemJS模块加载)

//
从“时刻”导入*作为时刻;
从“lodash”中导入*as uu;
...
...
const now=(this.timestamp==0)?矩():矩(此.timestamp);
我得到一个“TypeError:瞬间不是一个函数”

定义的结构与相同,这很好,所以我不知道原因是什么


有人能帮忙吗?

现在还不清楚您是想用moment进行客户端开发还是服务器端开发(例如node.js)。但是,如果您的案例是前端的,那么我可以非常轻松地使用:

1) 我刚刚将文件添加到我的项目中:

2) 编写了一个简单的测试代码:

window.onload = () =>
{
    var timestamp: number = 111111111111111;
    var momentResult: moment.Moment = moment(timestamp);
    alert(momentResult.toISOString());
};

我的项目构建正常,我在浏览器中看到了一个测试警报。

刚刚在我的项目中完成。这是有角度的,但我认为这不重要,可能会让你走上正确的道路。这很简单,因为:

import MomentStatic = moment.MomentStatic;

class HelpdeskTicketController {
  constructor(private moment: MomentStatic) { // angulars dependency injection, you will have some global probably
    let d = this.moment(new Date()); // works
    console.log(d.add(2, 'hours').format()); // works
  }

  ...

我想矩是用

jspm install moment
这应该在config.js的map部分添加一个条目

...
"moment": "npm:moment@2.10.6",
...
通过这种方式,您可以通过

import moment from 'moment';

console.log(moment().format('dddd, MMMM Do YYYY, h:mm:ss a'));
当您导入
*时,此时导入模块名称空间。所以,力矩将是一个对象,其属性为模块导出。这样,默认导出不会作为moment导入,而是作为moment.default导入。
大概是

moment.default().format('dddd, MMMM Do YYYY, h:mm:ss a')
可能在您的代码中实际工作,但不是预期的使用方式。

我执行了以下操作:

  var map = {
    // (...)
    moment: 'node_modules/moment',      
  };

  var packages = {
    // (...)
    moment: { main: 'moment.js', defaultExtension: 'js' },
  };
我安装了
力矩
,如下所示:

tsd install moment --save
然后我创建了main.ts

///<reference path="typings/moment/moment.d.ts" />

import moment = require("moment");
moment(new Date());
main.js
如下所示:

// https://github.com/ModuleLoader/es6-module-loader/blob/v0.17.0/docs/system-register.md - this is the corresponding doc
///<reference path="typings/moment/moment.d.ts" />
System.register(["moment"], function(exports_1) {
    var moment;
    return {
        setters:[
            function (moment_1) {
                // You can place `debugger;` command to debug the issue
                // "PLACE XY"
                moment = moment_1;
            }],
        execute: function() {
            moment(new Date());
        }
    }
});
//https://github.com/ModuleLoader/es6-module-loader/blob/v0.17.0/docs/system-register.md -这是对应的单据
///
系统寄存器([“时刻”],函数(导出1){
var矩;
返回{
二传手:[
函数(力矩_1){
//您可以放置`debugger;`命令来调试该问题
//“放置XY”
力矩=力矩_1;
}],
执行:函数(){
时刻(新日期());
}
}
});
我的打字脚本版本是1.6.2

这是我发现的:

Momentjs导出一个(即,
\u moment=utils\u hooks\u hooks
utils\u hooks\u hooks
是一个函数,这一点非常清楚

如果将断点放置在上面我表示为
placexy
的位置,可以看到
moment_1
是一个对象(!)而不是一个函数。相关行:


总之,问题与TypeScript无关。问题在于systemjs没有保留momentjs导出函数的信息。systemjs只是从模块复制导出对象的属性(函数也是JavaScript中的对象)我猜你应该在StaseJS知识库中提交一个问题,看看他们是否认为它是一个bug(或者一个特性:)。

< P>这是用角度2,但不应该是具体的。基本上,您只是告诉系统加载程序在哪里可以找到
moment.min.js

system.config.js中的

// map tells the System loader where to look for things
var map = {
  'app':                        'app', // 'dist',

  '@angular':                   'node_modules/@angular',
  'rxjs':                       'node_modules/rxjs',

  // tell system where to look for moment
  'moment':                     'node_modules/moment/min'
};

// packages tells the System loader how to load when no filename and/or no extension
var packages = {
  'app':                        { main: 'main.js',  defaultExtension: 'js' },
  'rxjs':                       { defaultExtension: 'js' },

  // tell system which file represents the script when you import
  'moment':                     { main: 'moment.min.js', defaultExtension: 'js'}
};
import moment from 'moment';
在您的模块中:

// map tells the System loader where to look for things
var map = {
  'app':                        'app', // 'dist',

  '@angular':                   'node_modules/@angular',
  'rxjs':                       'node_modules/rxjs',

  // tell system where to look for moment
  'moment':                     'node_modules/moment/min'
};

// packages tells the System loader how to load when no filename and/or no extension
var packages = {
  'app':                        { main: 'main.js',  defaultExtension: 'js' },
  'rxjs':                       { defaultExtension: 'js' },

  // tell system which file represents the script when you import
  'moment':                     { main: 'moment.min.js', defaultExtension: 'js'}
};
import moment from 'moment';
或(2016年10月13日编辑):


一些评论者已经发布了上面的
import*
语法,我在升级后也不得不切换到该语法(不知道为什么)。

自2.13版以来,《瞬间》包括打字脚本。不再需要使用
tsd
(或
打字

systemjs.config.js
文件中,只需添加以下内容:

  var map = {
    // (...)
    moment: 'node_modules/moment',      
  };

  var packages = {
    // (...)
    moment: { main: 'moment.js', defaultExtension: 'js' },
  };
在模块中:

import moment = require('moment')

在我的typescript文件中,当我使用

import moment from 'moment';
它说找不到模块“时刻”。我已经安装了作为npm包的矩,它被正确引用了,但是由于这个原因,moment.d.ts将矩导出为名称空间而不是下面的模块,我无法引用它

export = moment; 
所以如果我把它改成

declare module 'moment' {
    export default moment;
}

导入非常有效。我在这里做错了什么?

我很难让它正常工作,因为由于代理限制,我无法使用npm(因此必须手动安装库)。如果在项目中的适当位置安装了moment和definitelytyped文件的版本,则只需稍加修改即可使其正常工作

有一个关于使用矩配置typescript的有用说明。在我的案例中,有帮助的关键方面是在我的tsconfig.json文件的compilerOptions部分添加以下内容:

"allowSyntheticDefaultImports": true

对于我的东西,我使用VS 2015的网页包(更新3)。因此,在为package.json和webpack.config.vendor.js文件添加代码之后,我只需要在我的组件(TypeScript,Angular 2)的最顶端调用import-moment=require('moment')。

我的设置包括用于库的'jspm'和用于打字的'tsd'cli,没有您使用的直接脚本标记。我将对问题进行编辑以澄清。谢谢你的努力!谢谢你的回答。写入“从“时刻”导入时刻”会导致类型为“模块‘时刻’没有默认导出”的错误(这是真的)您使用哪个版本的momentjs?我认为已经进行了一些相关的讨论。参见第2.10.6节和第2.8.0节的打字。我觉得奇怪的是,我找不到一种方法将它集成到我的打字脚本中,没有做任何特别的事情,而且现在是一个如此受欢迎的库…:(没关系。尽管如此,我还是很感激。尝试:从“矩”中导入{moment};如果找不到新版本的d.ts,尝试使用矩2.8.0可能也很有用。您是否尝试过
import{moment}来自“矩”
?;如果您找不到新版本的d.ts,那么尝试使用矩2.8.0可能也很有用。@wilenx这很有趣,大约10分钟前我刚刚为这个问题添加了一个悬赏,我不得不使用“import*as moment from“矩”;”将矩加载到我的ts文件中