moment.js 如何用打字稿导入?
How can moment.js be imported with 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 class 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 构建时,我收到消息:"../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
文件,还是我缺少一些设置?
更新
显然,moment 现在提供了自己的类型定义(根据 至少从 2.14.1 起),因此您根本不需要 typings
或 @types
。
import * as moment from 'moment'
应该加载 npm 包提供的类型定义。
然而,正如 moment/pull/3319#issuecomment-263752265 中所述,目前团队在维护这些定义方面似乎存在一些问题(他们仍在寻找维护它们的人)。
您需要安装 moment
没有 --ambient
标志的类型。
然后使用 import * as moment from 'moment'
包含它
通过打字
Moment.js v2.14.1 现在支持 TypeScript。
参见:https://github.com/moment/moment/pull/3280
直接
可能不是最好的答案,但这是蛮力方式,对我很有效。
- 只需下载实际的
moment.js
文件并将其包含在您的项目中。
- 例如,我的项目是这样的:
$ tree
.
├── main.js
├── main.js.map
├── main.ts
└── moment.js
- 这里是示例源代码:
```
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'));
- 只需使用
node
到运行main.js
。
需要在TS中分别导入moment()函数和Momentclass
我在打字稿文档中找到了一条注释 here。
/*~ Note that ES6 modules cannot directly export callable functions
*~ This file should be imported using the CommonJS-style:
*~ import x = require('someLibrary');
所以将moment js导入typescript的代码实际上是这样的:
import { Moment } from 'moment'
....
let moment = require('moment');
...
interface SomeTime {
aMoment: Moment,
}
...
fn() {
...
someTime.aMoment = moment(...);
...
}
不确定何时更改,但使用最新版本的打字稿,您只需要使用 import moment from 'moment';
,其他一切都应该正常工作。
更新:
看起来最近修复了他们的导入。至少从 2.24.0
开始,您需要使用 import * as moment from 'moment';
ES6语法:
1.安装时刻
npm install --save moment
2。在您的打字稿文件中导入“时刻”
import moment from 'moment';
我刚刚注意到我点赞和评论的答案含糊不清。所以以下正是对我有用的。我目前在 Moment 2.26.0
和 TS 3.8.3
:
在代码中:
import moment from 'moment';
在 TS 配置中:
{
"compilerOptions": {
"esModuleInterop": true,
...
}
}
我正在为 CommonJS 和 EMS 构建,因此此配置被导入到其他配置文件中。
见解来自 ,它与使用 Express 相关。不过,我认为值得在这里添加,以帮助任何搜索与 Moment.js 有关的人,而不是更笼统的东西。
还是坏了?尝试卸载 @types/moment
。
所以,我从 package.json
文件中删除了 @types/moment
包,它使用:
import * as moment from 'moment'
较新版本的 moment
不需要 @types/moment
包,因为类型已经包含在内。
我正在尝试学习打字稿。虽然我认为这无关紧要,但我在此演示中使用 VSCode。
我有一个 package.json
,里面有这些碎片:
{
"devDependencies": {
"gulp": "^3.9.1",
"jspm": "^0.16.33",
"typescript": "^1.8.10"
},
"jspm": {
"moment": "npm:moment@^2.12.0"
}
}
然后我有一个 Typescript class 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 构建时,我收到消息:"../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
文件,还是我缺少一些设置?
更新
显然,moment 现在提供了自己的类型定义(根据 typings
或 @types
。
import * as moment from 'moment'
应该加载 npm 包提供的类型定义。
然而,正如 moment/pull/3319#issuecomment-263752265 中所述,目前团队在维护这些定义方面似乎存在一些问题(他们仍在寻找维护它们的人)。
您需要安装 moment
没有 --ambient
标志的类型。
然后使用 import * as moment from 'moment'
通过打字
Moment.js v2.14.1 现在支持 TypeScript。
参见:https://github.com/moment/moment/pull/3280
直接
可能不是最好的答案,但这是蛮力方式,对我很有效。
- 只需下载实际的
moment.js
文件并将其包含在您的项目中。 - 例如,我的项目是这样的:
$ tree
.
├── main.js
├── main.js.map
├── main.ts
└── moment.js
- 这里是示例源代码:
```
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'));
- 只需使用
node
到运行main.js
。
需要在TS中分别导入moment()函数和Momentclass
我在打字稿文档中找到了一条注释 here。
/*~ Note that ES6 modules cannot directly export callable functions
*~ This file should be imported using the CommonJS-style:
*~ import x = require('someLibrary');
所以将moment js导入typescript的代码实际上是这样的:
import { Moment } from 'moment'
....
let moment = require('moment');
...
interface SomeTime {
aMoment: Moment,
}
...
fn() {
...
someTime.aMoment = moment(...);
...
}
不确定何时更改,但使用最新版本的打字稿,您只需要使用 import moment from 'moment';
,其他一切都应该正常工作。
更新:
看起来最近修复了他们的导入。至少从 2.24.0
开始,您需要使用 import * as moment from 'moment';
ES6语法:
1.安装时刻
npm install --save moment
2。在您的打字稿文件中导入“时刻”
import moment from 'moment';
我刚刚注意到我点赞和评论的答案含糊不清。所以以下正是对我有用的。我目前在 Moment 2.26.0
和 TS 3.8.3
:
在代码中:
import moment from 'moment';
在 TS 配置中:
{
"compilerOptions": {
"esModuleInterop": true,
...
}
}
我正在为 CommonJS 和 EMS 构建,因此此配置被导入到其他配置文件中。
见解来自
还是坏了?尝试卸载 @types/moment
。
所以,我从 package.json
文件中删除了 @types/moment
包,它使用:
import * as moment from 'moment'
较新版本的 moment
不需要 @types/moment
包,因为类型已经包含在内。