如何在带有SystemJS的TypeScript中使用momentjs?
我的项目设置包括用于库的“jspm”工具和用于打字的“tsd”工具 在安装了矩的TypeScript d.ts文件()之后,我找不到加载和实际使用矩实例的方法 在我的文件中(使用SystemJS模块加载)如何在带有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:瞬间不是一个函数” 定义的结构与相同,这很好,所以我不知道原因是什么
//
从“时刻”导入*作为时刻;
从“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文件中