如何使用打字稿导入moment.js?

问题描述 投票:59回答:5

我正在尝试学习Typescript。虽然我认为它不相关,但我正在使用VSCode进行此演示。

我有一个package.json,里面有这些碎片:

{
  "devDependencies": {
    "gulp": "^3.9.1",
    "jspm": "^0.16.33",
    "typescript": "^1.8.10"
  },
  "jspm": {
    "moment": "npm:moment@^2.12.0"
  }
}

然后我有一个这样的Typescript类main.js

import moment from 'moment';
export class Main {
}

我的gulpfile.js看起来像这样:

var gulp = require('gulp');
var typescript = require('gulp-tsb');
var compilerOptions = {
                        "rootDir": "src/",
                        "sourceMap": true,
                        "target": "es5",
                        "module": "amd",
                        "declaration": false,
                        "noImplicitAny": false,
                        "noResolve": true,
                        "removeComments": true,
                        "noLib": false,
                        "emitDecoratorMetadata": true,
                        "experimentalDecorators": true
                      };
var typescriptCompiler = typescript.create(compilerOptions);
gulp.task('build', function() {
  return gulp.src('/src')
    .pipe(typescriptCompiler())
    .pipe(gulp.dest('/dest'));
});

当我运行gulp build时,我收到消息:"../main.ts(1,25): Cannot file module 'moment'."

如果我使用import moment = require('moment');然后jspm将工作并在我运行应用程序时引入模块,但我仍然收到构建错误。我也尝试过:

npm install typings -g
typings install moment --ambient --save

它没有让问题变得更好,而是变得更糟。现在我在构建时遇到以上错误以及以下错误:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."

如果我转到typings提供的文件并添加到文件的底部:

declare module "moment" { export = moment; }

我可以得到第二个错误消失,但我仍然需要require语句来获取我的main.ts文件中的时间,我仍然得到第一个构建错误。

我是否需要暂时创建自己的.d.ts文件,或者只是缺少一些设置文件?

typescript momentjs jspm
5个回答
80
投票

更新

显然,时刻现在提供了自己的类型定义(根据sivabudh至少从2.14.1向上),因此你根本不需要typings@types

import * as moment from 'moment'应该加载npm包提供的类型定义。

然而,正如在moment/pull/3319#issuecomment-263752265所说的那样,团队似乎在维护这些定义方面存在一些问题(他们仍在寻找维护它们的人)。


您需要在没有moment标志的情况下安装--ambient typings。

然后使用import * as moment from 'moment'包含它


34
投票

你需要在TS中分别导入moment()函数和Moment类。

我在打字稿文档here中找到了一个注释。

/ *〜注意ES6模块不能直接导出可调用函数。 *〜此文件应使用CommonJS样式导入:* ~import x = require('someLibrary');

因此,将时刻js导入typescript的代码实际上如下所示:

import { Moment } from 'moment'
....
let moment = require('moment');
...
interface SomeTime {
  aMoment: Moment,
}
...
fn() {
  ...
  someTime.aMoment = moment(...);
  ...
}

14
投票

通过打字

Moment.js现在支持v2.14.1中的TypeScript。

见:https://github.com/moment/moment/pull/3280


可能不是最好的答案,但这是蛮力的方式,它对我有用。

  1. 只需下载实际的moment.js文件并将其包含在您的项目中。
  2. 例如,我的项目如下所示:

$ tree . ├── main.js ├── main.js.map ├── main.ts └── moment.js

  1. 这是一个示例源代码:

```

import * as moment from 'moment';

class HelloWorld {
    public hello(input:string):string {
        if (input === '') {
            return "Hello, World!";
        }
        else {
            return "Hello, " + input + "!";
        }
    }
}

let h = new HelloWorld();
console.log(moment().format('YYYY-MM-DD HH:mm:ss'));
  1. 只需使用node来运行main.js

8
投票

不知道什么时候改变了,但是使用最新版本的打字稿,你只需要使用import moment from 'moment';,其他一切都应该正常工作。

更新:

看起来最近时刻修复了他们的导入。至少2.24.0你会想要使用import * as moment from 'moment';


1
投票

1.安装时刻

npm install moment --save

2.在您的打字稿文件中测试此代码

import moment = require('moment');

console.log(moment().format('LLLL'));
© www.soinside.com 2019 - 2024. All rights reserved.