Làm cách nào để có thể nhập moment.js bằng typecript?


96

Tôi đang cố gắng học tập chữ. Mặc dù tôi không nghĩ nó có liên quan, nhưng tôi đang sử dụng VSCode cho bản demo này.

Tôi có một package.jsoncái có những phần này trong đó:

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

Sau đó, tôi có một lớp Typecript main.jsnhư thế này:

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

Của tôi gulpfile.jstrông như thế này:

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'));
});

Khi tôi chạy bản dựng gulp, tôi nhận được thông báo: "../main.ts(1,25): Cannot file module 'moment'."

Nếu tôi sử dụng import moment = require('moment');thì jspm sẽ hoạt động và đưa vào mô-đun khi tôi chạy ứng dụng, nhưng tôi vẫn nhận được lỗi xây dựng. Tôi cũng đã thử:

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

Thay vì làm cho vấn đề tốt hơn, nó lại trở nên tồi tệ hơn. Bây giờ tôi gặp lỗi ở trên trên bản dựng cũng như những thứ sau:"../typings/browser/ambient/moment/index.d.ts(9,21): Cannot find namespace 'moment'."

Nếu tôi đi đến tệp được cung cấp bởi cách đánh máy và thêm vào cuối tệp:

declare module "moment" { export = moment; }

Tôi có thể gặp lỗi thứ hai để biến mất, nhưng tôi vẫn cần câu lệnh request để có thời gian hoạt động trong main.tstệp của mình và vẫn gặp lỗi bản dựng đầu tiên.

Tôi có cần tạo .d.tstệp của riêng mình trong giây lát hay chỉ có một số phần thiết lập mà tôi đang thiếu?


1
Thêm bản cập nhật này cho bất kỳ ai gặp phải vấn đề này ngay bây giờ: import moment, { Moment } from 'moment';cho phép bạn làm const x = moment();const x: Moment = moment();
ryuu9187

Không có giải pháp nào trong số những giải pháp này hoạt động, tôi đã chuyển đến đây - github.com/date-fns/date-fns
chrismarx

Câu trả lời:


124

Cập nhật

Rõ ràng, thời điểm bây giờ cung cấp các định nghĩa kiểu của riêng nó (theo sivabudh ít nhất là từ 2.14.1 trở lên), do đó bạn không cần typingshoặc không cần @types.

import * as moment from 'moment' nên tải các định nghĩa kiểu được cung cấp với gói npm.

Tuy nhiên, điều đó đã nói, như đã nói trong moment / pull / 3319 # releaseecomment-263752265 , nhóm hiện tại dường như có một số vấn đề trong việc duy trì các định nghĩa đó (họ vẫn đang tìm kiếm người duy trì chúng) .


Bạn cần cài đặt các kiểu đánh máy momentkhông có --ambientcờ.

Sau đó, bao gồm nó bằng cách sử dụng import * as moment from 'moment'


Điều đó đã hiệu quả. Bạn có thể giải thích sự khác biệt giữa việc sử dụng --ambientcờ và không? Tôi có số để làm việc bằng cách sử dụng cờ xung quanh. Ngoài ra, trang chính của họ npmjs.com/package/typings đưa ra ví dụ bằng cách sử dụng cờ xung quanh. Tôi không biết khi nào tôi muốn / cần sử dụng cái này hơn cái kia. Cảm ơn!
peinearydevelopment

1
Thành thật mà nói, tôi không thể. Thông thường bạn sử dụng --ambientcờ cho tất cả các định nghĩa Typecript từ typings/ DefinitelyTypednhưng momentđịnh nghĩa này có một số cấu trúc lạ và các tệp không được tải xuống đúng cách. Nếu bạn nhìn vào tệp định nghĩa moment.d.ts, nó chỉ chứa tham chiếu đến phiên bản nút, phiên bản này không được giải quyết khi tải xuống (có thể đáng để mở sự cố).
Hỗ trợ

Rõ ràng đã có là một trong những liên quan đến vấn đề này: github.com/DefinitelyTyped/DefinitelyTyped/issues/8388
peinearydevelopment

1
Tôi đã làm cho nó hoạt động bằng cách sử dụng import * ngay từ lúc 'moment / moment' b / c nó được cài đặt dưới dạng một thư mục con trong thư mục node-module.
dùng441058

1
Tôi đang sử dụng gói web và phiên bản thời điểm 2.17.1 nhưng vẫn không thể làm cho nó hoạt động. Tôi đã thử: import * as moment from 'moment'; và nhập * dưới dạng thời điểm từ 'thời điểm / khoảnh khắc'; và không hoạt động!
Mohy Eldeen

59

Bạn cần nhập hàm moment () và lớp Moment riêng biệt trong TS.

Tôi tìm thấy một ghi chú trong tài liệu sắp chữ ở đây .

/ * ~ Lưu ý rằng mô-đun ES6 không thể xuất trực tiếp các hàm có thể gọi
* ~ Tệp này phải được nhập bằng kiểu CommonJS:
* ~ import x = request ('someLibrary');

Vì vậy, mã để nhập thời điểm js vào bản ghi thực sự trông giống như sau:

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

1
Câu trả lời tốt vì nó cho thấy sự khác biệt giữa loại và chức năng. Cảm ơn!
Jelle den Burger

không thể tìm thấy tên 'yêu cầu'
Vùng chứa được mã hóa

4
Bây giờ điều này có thể được sử dụng như import * as moment from 'moment';và sau đó sử dụng moment.Momentcho các bản đánh máy.
sao băng

Điều làm việc cho tôi là: import moment = demand ('moment');
Telmo Pimentel Mota

Thực ra bạn cũng có thể sử dụng moment.Momentgiao diện trực tiếp từ không gian tênmoment
HalfWebDev

20

Không chắc điều này đã thay đổi khi nào, nhưng với phiên bản mới nhất của sắp chữ, bạn chỉ cần sử dụng import moment from 'moment';và mọi thứ khác sẽ hoạt động bình thường.

CẬP NHẬT:

Có vẻ như thời điểm gần đây đã sửa lỗi nhập của họ. Ít nhất 2.24.0bạn sẽ muốn sử dụngimport * as moment from 'moment';


5
import * as moment from 'moment'sẽ không hoạt động với bảng chữ nhưng import moment from 'moment'có.
Stuart McIntyre

Nó đang hoạt động nhưng tôi đang tính giờ GMT 0, nhưng tôi cần giờ địa phương không hoạt động. Tôi cũng thử với moment (). Utc (). Format () nhưng nó đang kiểm tra lại kết quả tương tự.
kbhaskar

@kbhaskar kể từ phiên bản mới nhất hiện tại, họ đã sửa lỗi nhập của mình. Xem câu trả lời cập nhật
NSjonas

1
Tôi nghĩ rằng điều này là khá nhiều. Bước bổ sung duy nhất tôi phải làm là thêm esModuleInteropthiết lập truevào cấu hình của mình, mà tôi nhận được từ câu trả lời này . Cảm ơn.
Mark Birbeck

14

qua cách đánh máy

Moment.js hiện hỗ trợ TypeScript trong v2.14.1.

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


Trực tiếp

Có thể không phải là câu trả lời tốt nhất, nhưng đây là cách vũ phu, và nó phù hợp với tôi.

  1. Chỉ cần tải xuống moment.jstệp thực tế và đưa nó vào dự án của bạn.
  2. Ví dụ: dự án của tôi trông như thế này:

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

  1. Và đây là một mã nguồn mẫu:

``

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. Chỉ cần sử dụng nodeđể chạy main.js.

Có, tôi xác nhận đây là câu trả lời phải. Làm việc như người ở.
Capy

Khi tôi cố gắng thực hiện việc này bằng cách sử dụng npm i @ type / moment, tôi nhận được lỗi: Lỗi TypeScript: src \ app.ts (1,1): error TS7038: Không thể gọi hoặc xây dựng quá trình nhập kiểu không gian tên và sẽ gây ra một lỗi trong thời gian chạy. trên tsc -v 2.7.2
GONeale

2

Tôi chỉ nhận thấy rằng câu trả lời mà tôi đã ủng hộ và nhận xét là không rõ ràng. Vì vậy, sau đây là chính xác những gì đã làm việc cho tôi. Tôi hiện đang ở trên Moment 2.26.0và TS 3.8.3:

Trong mã:

import moment from 'moment';

Trong cấu hình TS:

{
  "compilerOptions": {
    "esModuleInterop": true,
    ...
  }
}

Tôi đang xây dựng cho cả hai CommonJS và EMS nên cấu hình này được nhập vào các tệp cấu hình khác.

Cái nhìn sâu sắc đến từ câu trả lời này liên quan đến việc sử dụng Express. Tuy nhiên, tôi thấy rằng nó đáng được thêm vào đây, để giúp bất kỳ ai tìm kiếm liên quan đến Moment.js, thay vì một cái gì đó chung chung hơn.


thì bạn có thể sử dụng moment()như bình thường thay vìmoment.default()
xinthose

0

1. cài đặt thời điểm

npm install moment --save

2. kiểm tra mã này trong tệp bảng chữ của bạn

import moment = require('moment');

console.log(moment().format('LLLL'));

1
Đây không phải là cách thích hợp để nhập mô-đun trong bảng chữ. Vui lòng xem xét cập nhật câu trả lời của bạn. Tham khảo phần này để xác nhận: basarat.gitbook.io/typescript/project/modules/external-modules
Efe Ariaroo

0

Vẫn bị hỏng? Thử gỡ cài đặt@types/moment .

Vì vậy, tôi đã xóa @types/momentgói khỏi package.jsontệp và nó hoạt động bằng cách sử dụng:

import * as moment from 'moment'

Các phiên bản mới hơn của momentkhông yêu cầu @types/momentgói vì các loại đã được bao gồm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.