วิธีการใช้ห้องสมุด moment.js ในแอพ angular 2 typescript


231

ฉันพยายามใช้กับการเชื่อม typescript:

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

test.ts:

import {moment} from 'moment/moment';

และไม่มี:

npm install moment --save

test.ts:

var moment = require('moment/moment');

แต่เมื่อฉันเรียกโมเมนต์รูปแบบ () ฉันได้รับข้อผิดพลาด ควรจะเรียบง่ายหรือไม่ทุกคนสามารถให้ชุดคำสั่ง / ชุดการนำเข้าที่จะทำงานได้หรือไม่


1
แบ่งปันข้อผิดพลาดของคุณโปรด
basarat

1
หากฉันติดตั้ง moment.d.ts และใช้การนำเข้าฉันจะได้รับข้อผิดพลาดในการรวบรวมข้อผิดพลาดใน ... / typings / browser / ambient / moment / moment.d.ts (9,21): error TS2503: หา namespace 'moment' . และถ้าฉันไม่ได้ติดตั้งการพิมพ์และการใช้งานที่ต้องการฉันจะได้รับ Uncaught TypeError: เดี๋ยวรูปแบบไม่ใช่ฟังก์ชั่น
Sergey Aldoukhov

มีคำตอบเก่าแก่มากเกินไปที่นี่ โปรดดูที่นี่: github.com/angular/angular-cli/wiki/…
Didia

3
คำตอบของ Hinrich ทำงานให้ฉันกับ NG4 ( ณ มิถุนายน 2017) stackoverflow.com/a/43257938/1554495
เนื้อสัน

SergeyAldoukhov ยังคงเป็นคำตอบที่ดีที่สุด? แน่นอน @ Hinrich's คืออะไร?
jenson-button-event

คำตอบ:


513

อัปเดตเมษายน 2560:

ตั้งแต่เวอร์ชัน 2.13.0 Moment มีไฟล์นิยาม typescript https://momentjs.com/docs/#/use-it/typescript/

เพียงติดตั้งด้วย npm ในประเภทคอนโซลของคุณ

npm install --save moment

จากนั้นในแอพเชิงมุมของคุณการนำเข้านั้นง่ายเหมือนนี้

import * as moment from 'moment';

แค่นั้นแหละคุณจะได้รับการสนับสนุนจาก typescript เต็ม!

การแก้ไขโบนัส:หากต้องการพิมพ์ตัวแปรหรือคุณสมบัติเช่นเดียวกับMomentใน typescript คุณสามารถทำได้เช่น:

let myMoment: moment.Moment = moment("someDate");

1
มันเป็นสิ่งสำคัญที่จะเพิ่มลงในไฟล์ app.module ของคุณและนำเข้าอาร์เรย์? หรือคุณสามารถนำเข้าภายในส่วนประกอบและใช้งานหรือไม่
Katherine R

3
@Katherine R คุณสามารถใช้มันในไฟล์ใดก็ได้ไม่ใช่เฉพาะเชิงมุม
Hinrich

ตอนนี้ปลั๊กอินช่วงเวลาเช่นช่วงเวลารอบอะไร
Greywire

2
ที่จริงคำตอบนี้ไม่เฉพาะเชิงมุมมันนำไปใช้กับโครงการ typescript ใด ๆ
Hinrich

ยอดเยี่ยมและฉันใช้ไปป์กับเทมเพลตได้อย่างไร
vladanPro

98

momentเป็นทรัพยากรระดับโลกของบุคคลที่สาม วัตถุขณะนั้นอาศัยอยู่windowในเบราว์เซอร์ ดังนั้นจึงไม่ถูกต้องimportในแอปพลิเคชัน angular2 ของคุณ ให้ใส่<script>แท็กใน html ของคุณแทนซึ่งจะโหลดไฟล์ moment.js

เพื่อทำให้ TypeScript มีความสุขคุณสามารถเพิ่ม

declare var moment: any;

ที่ด้านบนของไฟล์ที่คุณใช้เพื่อหยุดข้อผิดพลาดในการรวบรวมหรือคุณสามารถใช้

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

หรือใช้ tsd เพื่อติดตั้งไฟล์ moment.d.ts ซึ่ง TypeScript อาจพบด้วยตัวมันเอง

ตัวอย่าง

import {Component} from 'angular2/core';
declare var moment: any;

@Component({
    selector: 'example',
    template: '<h1>Today is {{today}}</h1>'
})
export class ExampleComponent{
    today: string = moment().format('D MMM YYYY');
}

ให้แน่ใจว่าได้เพิ่มแท็กสคริปต์ใน html ของคุณหรือช่วงเวลาที่ไม่มีอยู่

<script src="node_modules/moment/moment.js" />

การโหลดโมดูล moment

ก่อนอื่นคุณต้องติดตั้งโมดูลโหลดเดอร์เช่น System.jsเพื่อโหลดไฟล์ commonjs ในขณะนั้น

System.config({
    ...
    packages: {
        moment: {
            map: 'node_modules/moment/moment.js',
            type: 'cjs',
            defaultExtension: 'js'
        }
    }
});

จากนั้นจะนำเข้าช่วงเวลาในไฟล์ที่ต้องการใช้

import * as moment from 'moment';

หรือ

import moment = require('moment');

แก้ไข:

นอกจากนี้ยังมีตัวเลือกสำหรับผู้ให้บริการบางอย่างเช่นผู้สร้าง Webpack หรือผู้สร้าง SystemJS หรือ Browserify ที่จะช่วยให้คุณไม่พลาดวัตถุหน้าต่าง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้กรุณาเยี่ยมชมเว็บไซต์ของพวกเขาสำหรับการเรียนการสอน


3
เป็นไปได้ แต่มีความยาวมากเนื่องจากคุณต้องมีโมดูลโหลดเดอร์เช่นSystemโหลดในช่วงเวลาโหนด commonjs แล้วคุณจะสามารถอ้างอิงได้ด้วยimport * as moment from 'moment';หรือimport moment = require('moment');ว่าสำหรับทุก intents และวัตถุประสงค์เหมือนกัน แต่มี ความแตกต่างเล็กน้อยใน typescript
SnareChops

@SnareChops typings install moment --ambient -- saveไม่typingsดึงไฟล์นิยามลงมาและสร้างการอ้างอิงถึง///<reference path="./path/to/moment.d.ts" />? ฉันมีข้อผิดพลาดเดียวกันเมื่อทำงานnpm run tsc
Shawn Northrop

นี่เป็นสิ่งที่ทำให้เข้าใจผิด ไม่มีอะไรผิดปกติกับimportช่วงเวลาที่ไอเอ็นจี
สติกเลอ

2
คำตอบนี้ไม่สมบูรณ์เพราะคุณต้องใช้การพิมพ์เพื่อจัดการคำจำกัดความของช่วงเวลา นอกจากนี้มันไม่จำเป็นต้องนำเข้าอะไร โปรดดูที่การร้องคำตอบของฉัน
Bernardo Pacheco

8
คำตอบนี้ทำให้เข้าใจผิดความจริงที่ว่าช่วงเวลาที่เป็นตัวแปรทั่วโลกไม่ได้หมายความว่าคุณ "มี" เพื่อโหลดมันเป็นแท็กสคริปต์ คุณสามารถและควรรวมไว้ในไฟล์ผู้จัดจำหน่ายหากคุณใช้ Bundler (Webpack) บางประเภท นอกจากนี้คุณยังสามารถแก้ไขปัญหาการมอบหมายทั่วโลกหากคุณใช้ webpack และตัวโหลดที่เหมาะสม
Shlomi Assaf

49

ต่อไปนี้ใช้งานได้สำหรับฉัน

ก่อนอื่นให้ติดตั้งข้อกำหนดประเภทชั่วครู่

typings install moment --save

(หมายเหตุ: ไม่--ambient)

จากนั้นเพื่อหลีกเลี่ยงการขาดการส่งออกที่เหมาะสม:

import * as moment from 'moment';

2
ฉันต้องทำimport moment from "moment";แทนเพื่อให้มันใช้งานได้
Aetherix

3
คำตอบนี้ไม่สมบูรณ์เพราะคุณไม่จำเป็นต้องนำเข้าอะไร โปรดดูที่การร้องคำตอบของฉัน
Bernardo Pacheco

1
นอกจากนี้ทุก ๆ การทำซ้ำของ ionic 2 beta / angular 2 rc ดูเหมือนจะนำวิธีการใหม่ในการนำเข้าสิ่งต่าง ๆ ดังนั้นคุณอาจต้องลองใช้คำแนะนำเหล่านี้แม้ว่าจุดหนึ่งที่พวกเขาเคยเป็นคำตอบที่ทันสมัยที่สุด
discodane

import * as moment from 'moment';เป็นกุญแจสำคัญ
นิมา

ฉันไม่พบ "ช่วงเวลา" ("npm") ในรีจิสทรี เมื่อฉันพยายามติดตั้งคำจำกัดความโปรดช่วย
Sebastián Rojas

28

ฉันจะไปกับ:

npm install moment --save

ในsystemjs.config.jsไฟล์mapอาร์เรย์ของคุณให้เพิ่ม:

'moment': 'node_modules/moment'

ในpackagesอาร์เรย์เพิ่ม:

'moment': { defaultExtension: 'js' }

ใน component.ts ของคุณใช้: import * as moment from 'moment/moment';

และนั่นคือมัน คุณสามารถใช้จากคลาสของส่วนประกอบของคุณ:

today: string = moment().format('D MMM YYYY');


25

เรากำลังใช้โมดูลตอนนี้

ลอง import {MomentModule} from 'angular2-moment/moment.module';

หลังจาก npm install angular2-moment

http://ngmodules.org/modules/angular2-moment


76
สิ่งนี้ไม่เพียงพอเนื่องจากจะติดตั้งไปป์เท่านั้น เห็นได้ชัดว่าคุณไม่สามารถทำงานกับวันที่ช่วงเวลาในโมดูลของคุณด้วยวิธีนี้
ntaso

1
จะรักเคล็ดลับบางอย่างเกี่ยวกับวิธีการใช้ตัวกรอง angular2-moment ในคลาสคอมโพเนนต์
trickpatty

3
สิ่งนี้ควรเป็น: นำเข้า {MomentModule} จาก 'angular2-moment / moment.module';
yasser

1
นี่ไม่ควรเป็นคำตอบที่เลือกอีกต่อไป ดูคำตอบของ @Hinrich npm install moment --save, npm install @types/moment --save stackoverflow.com/questions/35166168/…
jamesjansson

แทนที่จะติดตั้งเสื้อคลุมควรเป็นเช่นimport * as moment from 'moment';
M. Atif Riaz

22

หากต้องการใช้ในTypescriptโครงการคุณจะต้องติดตั้งช่วงเวลา:

npm install moment --save

หลังจากติดตั้งช่วงเวลาคุณสามารถใช้งานได้ใน.tsไฟล์ใด ๆหลังจากนำเข้า:

import * as moment from "moment";


1
หมายเหตุ ** @ ประเภท / โมฆะ @ 2.13.0: นี่เป็นคำจำกัดความประเภทต้นขั้วสำหรับช่วงเวลา ( github.com/moment/moment ) Moment ให้คำจำกัดความประเภทของตัวเองดังนั้นคุณไม่จำเป็นต้องติดตั้ง @ types / moment!
Winnemucca

1
ที่ดี! นี่คือการอ้างอิงอย่างเป็นทางการ: momentjs.com/docs/#/use-it/typescript
Andrea

14

--- ปรับปรุง 11/01/2017

typingsจะเลิกตอนนี้และมันถูกแทนที่ด้วย@types NPM นับจากนี้ไปการรับการประกาศประเภทจะไม่ต้องใช้เครื่องมือใดนอกจาก npm ในการใช้ช่วงเวลาคุณไม่จำเป็นต้องติดตั้งคำจำกัดความประเภทผ่าน @typesเนื่องจาก Moment ได้ให้คำจำกัดความประเภทไว้แล้ว

ดังนั้นจะลดลงเหลือเพียง 3 ขั้นตอน:

1 - ติดตั้งช่วงเวลาที่มีคำจำกัดความประเภท:

npm install moment --save

2 - เพิ่มแท็กสคริปต์ในไฟล์ HTML ของคุณ:

<script src="node_modules/moment/moment.js" />

3 - ตอนนี้คุณสามารถใช้งานได้แล้ว ระยะเวลา

today: string = moment().format('D MMM YYYY');

--- คำตอบเดิม

สามารถทำได้ใน 3 ขั้นตอน:

1 - ติดตั้งการกำหนดช่วงเวลา - ไฟล์* .d.ts :

typings install --save --global dt~moment dt~moment-node

2 - เพิ่มแท็กสคริปต์ในไฟล์ HTML ของคุณ:

<script src="node_modules/moment/moment.js" />

3 - ตอนนี้คุณสามารถใช้งานได้แล้ว ระยะเวลา

today: string = moment().format('D MMM YYYY');

ฉันมีปัญหากับรุ่นการพิมพ์ที่มีอยู่ใน dt กำลังใช้ช่วงเวลาเวอร์ชันเก่าที่ไม่มีวิธีการใหม่ที่ฉันต้องการใช้ ถ้าฉันทำตามที่พวกเขาแนะนำ ( momentjs.com/docs/#/use-it/system-js ) คอมไพล์แอปพลิเคชัน แต่ไม่โหลดในเบราว์เซอร์ ฉันเกือบจะถึงจุดจบแล้ว ...
Fabricio

ฉันไม่สามารถรับแท็กสคริปต์ให้ทำงานกับ angi cli ได้ ทำให้รู้สึกมากกว่าการนำเข้า
Winnemucca

@Bernardo ฉันลองทำตามขั้นตอนของคุณและติดตั้ง moment.js หลังจากdeclare var moment;อย่างไรก็ตามการพิมพ์ไม่ได้ผลสำหรับฉัน หลังจากพิมพ์moment().ไม่มี IntelliSense ฉันคิดว่าฉันพลาดขั้นตอนนี้ไปสักครู่
ชยามาลปาริ

ค่อนข้างแน่ใจว่ามันใช้งานไม่ได้เว็บแพ็ครู้ได้อย่างไรว่าจะรวมสิ่งนี้ไว้ในโมดูลโหนดบิลด์
johnny 5

12

สำหรับAngular 7+ (รองรับ 8 และ 9 ด้วย) :

1: ติดตั้งช่วงเวลาตามคำสั่ง npm install moment --save

2: อย่าเพิ่มอะไรใน app.module.ts

3: เพียงเพิ่มคำสั่งนำเข้าที่ด้านบนของcomponentไฟล์อื่น ๆ เช่นนี้:import * as moment from 'moment';

4: ตอนนี้คุณสามารถใช้momentที่ใดก็ได้ในรหัสของคุณ เหมือนกับ:

myDate = moment(someDate).format('MM/DD/YYYY HH:mm');


ฉันต้องนำเข้าแบบนี้: import * as moment_ from 'moment'; const moment = moment_;ไม่เช่นนั้นฉันจะได้รับError: Cannot call a namespace ('moment')
Snook

ฟังแปลกมาก moment_เป็นเพียงชื่อที่แท้จริง มันอาจเป็นอะไรก็ได้ฉันคิดว่า ...
Rahmat Ali

1
เพิ่งทราบว่าimport * as moment from 'moment';เพิ่มขนาดของบันเดิลโดย ~ 500kb มีบทความที่ดีอธิบายปัญหาเกี่ยวกับวิธีแก้ปัญหากลาง.jonasbandi.net/…
Kosmonaft

9

ด้วย ng CLI

> npm install moment --save

ใน app.module

import * as moment from 'moment';

providers: [{ provide: 'moment', useValue: moment }]

ในองค์ประกอบ

constructor(@Inject('moment') private moment)

ด้วยวิธีนี้คุณนำเข้าช่วงเวลาหนึ่งครั้ง

UPDATE Angular => 5

{
   provide: 'moment', useFactory: (): any => moment
}

สำหรับฉันทำงานในแยงกับ aot และยังเป็นสากล

ฉันไม่ชอบใช้งาน แต่ใช้โมเมนต์

Error   Typescript  Type 'typeof moment' is not assignable to type 'Moment'. Property 'format' is missing in type 'typeof moment'.

ฉันได้รับParameter 'moment' implicitly has an 'any' typeข้อผิดพลาด
Azimuth

ใช้งานได้กับโหมด prod หรือไม่ มันทำงานได้ดีในโหมด dev แต่เมื่อฉันเรียกใช้แอพของฉันในโหมดแยงมันล้มเหลว แอพของฉันมีโมดูลโหลดขี้เกียจด้วย (ในกรณีที่มีความสำคัญ) ครู่หนึ่งกลายเป็นโมฆะ
jbgarr

@jbgarr ฉันได้ลองในโมดูลที่ขี้เกียจเช่นตัวสร้าง (@Inject ('ช่วงเวลา') ช่วงเวลาส่วนตัว) {console.log ('วันที่' ช่วงเวลาที่ ()); } โดยไม่มีปัญหา
Whisher

8

ไลบรารี angular2-moment มีไพพ์เช่น {{myDate | amTimeAgo}} เพื่อใช้ในไฟล์. html

ไปป์เดียวกันนั้นยังสามารถเข้าถึงได้เป็นฟังก์ชัน typescript ภายในไฟล์ component class (.ts) ก่อนติดตั้งห้องสมุดตามคำแนะนำ:

npm install --save angular2-moment

ใน node_modules / angular2-moment จะเป็นไฟล์ ".pipe.d.ts" เช่นcalendar.pipe.d.ts , date-format.pipe.d.tsและอื่น ๆ อีกมากมาย

แต่ละรายการมีชื่อฟังก์ชัน typescript สำหรับไพพ์เทียบเท่าเช่นDateFormatPipe ()เป็นฟังก์ชันสำหรับamDateFormatPipe amDateFormatPipe

ในการใช้DateFormatPipeในโครงการของคุณให้นำเข้าและเพิ่มไปยังผู้ให้บริการทั่วโลกของคุณใน app.module.ts:

import { DateFormatPipe } from "angular2-moment";
.....
providers: [{provide: ErrorHandler, useClass: IonicErrorHandler}, ...., DateFormatPipe]

จากนั้นในองค์ประกอบใด ๆ ที่คุณต้องการใช้ฟังก์ชั่นนำเข้ามันด้านบนฉีดเข้าไปในตัวสร้างและใช้:

import { DateFormatPipe } from "angular2-moment";
....
constructor(.......,  public dfp: DateFormatPipe) {
    let raw = new Date(2015, 1, 12);
    this.formattedDate = dfp.transform(raw, 'D MMM YYYY');
}

หากต้องการใช้ฟังก์ชันใด ๆ ให้ทำตามกระบวนการนี้ มันจะดีถ้ามีวิธีหนึ่งในการเข้าถึงฟังก์ชั่นทั้งหมด แต่ไม่มีวิธีการแก้ปัญหาข้างต้นสำหรับฉัน


ขอบคุณมากครับ! ทุก ๆ ช่วงเวลาสำหรับ angular2 จะแสดงวิธีใช้บนเทมเพลตเท่านั้น โพสต์ที่มีประโยชน์มากของคุณแสดงให้ฉันเห็นวิธีใช้เพื่อจัดการค่าก่อนที่ฉันจะส่งออกไปยังเทมเพลต
Andrew Junior Howard

@royappa ฉันเห็นบางคนใช้โมดูล Pipes และบางคนใช้เวลาเพียงครู่เดียวในการเข้าถึงใน typescript ฉันเข้าใจว่าคุณกำลังบอกว่าคุณสามารถใช้รุ่น Pipes ใน typescript แต่สิ่งที่เป็นอันตรายในการติดตั้งทั้งสอง?
Jacques

5

หากคุณกำลังถูกเพิ่มแพคเกจอื่น ๆ ของบุคคลที่สามผมใช้angular2 ช่วงเวลาห้องสมุด การติดตั้งค่อนข้างตรงไปตรงมาและคุณควรทำตามคำแนะนำล่าสุดของ README ฉันยังติดตั้งงานพิมพ์อันเป็นผลมาจากสิ่งนี้

ทำงานเหมือนมีเสน่ห์สำหรับฉันและเพิ่งเพิ่มรหัสใด ๆ เพื่อให้ทำงานได้


5

ไม่แน่ใจว่านี่ยังคงเป็นปัญหาสำหรับคนหรือไม่ ... การใช้ SystemJS และ MomentJS เป็นไลบรารีสิ่งนี้จะแก้ไขให้ฉันได้ไหม

/*
 * Import Custom Components
 */
import * as moment from 'moment/moment'; // please use path to moment.js file, extension is set in system.config

// under systemjs, moment is actually exported as the default export, so we account for that
const momentConstructor: (value?: any) => moment.Moment = (<any>moment).default || moment;

ทำงานได้ดีจากที่นั่นสำหรับฉัน


5

สำหรับ angular2 RC5 สิ่งนี้ใช้ได้กับฉัน ...

ติดตั้งช่วงเวลาแรกผ่านทาง npm

npm install moment --save

จากนั้นนำเข้าช่วงเวลาในองค์ประกอบที่คุณต้องการใช้

import * as moment from 'moment';

กำหนดค่าช่วงเวลาสุดท้ายใน systemjs.config.js "map" และ "packages"

// map tells the System loader where to look for things
  var map = {
  ....
  'moment':                     'node_modules/moment'
  };
  // packages tells the System loader how to load when no filename and/or no extension
  var packages = {
    ...
    'moment':                       { main:'moment', defaultExtension: 'js'}
  };

ความคิดเกี่ยวกับขั้นตอนที่เทียบเท่ากับ webpack คืออะไร?
Bharat Geleda

@BharatGeleda ไม่ต้องทำอะไรกับ webpack ใช้ Angular2 และ angular-cli ฉันต้องติดตั้งและนำเข้ามัน ฉันไม่ต้องการการพิมพ์ใด ๆ เนื่องจากช่วงเวลารุ่นล่าสุดรองรับ typescript
Stanislasdrg Reinstate Monica

1
ทางออกเดียวที่ทำให้ฉันนำเข้าสถานที่อื่น: import 'moment/locale/de.js';ขอบคุณ!
iBaff

4

นอกจากคำตอบของ SnareChop แล้วฉันต้องเปลี่ยนไฟล์การพิมพ์สำหรับ momentjs

ในmoment-node.d.tsฉันแทนที่:

export = moment;

กับ

export default moment;


4

รุ่นของฉันเองในการใช้ช่วงเวลาในเชิงมุม

npm i moment --save

import * as _moment from 'moment';

...

moment: _moment.Moment = _moment();

constructor() { }

ngOnInit() {

    const unix = this.moment.format('X');
    console.log(unix);    

}

ช่วงเวลานำเข้าครั้งแรกเป็น_momentแล้วประกาศmomentตัวแปรด้วยชนิดที่_moment.Momentมีค่าเริ่มต้นเป็น_moment()ที่มีค่าเริ่มต้นของ

การนำเข้าช่วงเวลาธรรมดาจะไม่ทำให้คุณสมบูรณ์อัตโนมัติ แต่ถ้าคุณจะประกาศช่วงเวลาด้วยประเภทMomentอินเตอร์เฟสจาก_momentเนมสเปซจาก'moment'แพคเกจเริ่มต้นด้วยช่วงเวลาที่เรียกว่าเนมสเปซ_moment()ช่วยให้คุณเสร็จอัตโนมัติของช่วงเวลาของ API ของ

ฉันคิดว่านี่เป็นวิธีการเชิงช่วงเวลาที่ดีที่สุดในการใช้ช่วงเวลาโดยไม่ต้องใช้@types typingsหรือผู้ให้บริการเชิงมุมหากคุณกำลังมองหาการทำให้สมบูรณ์อัตโนมัติสำหรับห้องสมุดวานิลลาจาวาสคริปต์เช่นช่วงเวลา


การติดตั้งประเภทจะช่วยให้คุณเข้าถึงการเติมข้อความอัตโนมัติ:npm install @types/moment --save
jamesjansson

3

ลองเพิ่ม"allowSyntheticDefaultImports": trueของคุณtsconfig.jsonที่คุณ

ธงทำอะไร

โดยพื้นฐานแล้วจะบอกคอมไพเลอร์ TypeScript ว่าไม่เป็นไรที่จะใช้คำสั่งการนำเข้า ES6 เช่น

import * as moment from 'moment/moment';

ในโมดูล CommonJS เช่น Moment.js ซึ่งไม่ได้ประกาศการส่งออกเริ่มต้น การตั้งค่าสถานะมีผลกับการตรวจสอบประเภทไม่ใช่รหัสที่สร้างขึ้น

จำเป็นถ้าคุณใช้ SystemJS เป็นโมดูลโหลดเดอร์ของคุณ การตั้งค่าสถานะจะเปิดโดยอัตโนมัติถ้าคุณบอกคอมไพเลอร์ TS ของคุณว่าคุณใช้ SystemJS:

"module": "system"

นอกจากนี้ยังจะลบข้อผิดพลาดใด ๆ โยนโดย IDEs tsconfig.jsonถ้าพวกเขามีการกำหนดค่าที่จะทำให้การใช้งานของ


2

สำหรับ angular2 กับ systemjs และ jspm ต้องทำ:

import * as moment_ from 'moment';
export const moment =  moment_["default"];

var a = moment.now();
var b = moment().format('dddd');
var c = moment().startOf('day').fromNow();

2

สำหรับผู้ใช้ ANGULAR CLI

การใช้ไลบรารีภายนอกอยู่ในเอกสารประกอบที่นี่:

https://github.com/angular/angular-cli/wiki/stories-third-party-lib

เพียงติดตั้งห้องสมุดของคุณผ่าน

npm ติดตั้ง lib-name - บันทึก

และนำเข้ามาในรหัสของคุณ หากไลบรารีไม่มีการพิมพ์คุณสามารถติดตั้งโดยใช้:

npm ติดตั้ง lib-name - บันทึก

npm install @ types / lib-name --save-dev

จากนั้นเปิด src / tsconfig.app.json และเพิ่มลงในอาร์เรย์ประเภท:

"types": ["lib-name"]

หากไลบรารีที่คุณเพิ่มการพิมพ์นั้นใช้สำหรับการทดสอบ e2e ของคุณเท่านั้นให้ใช้ e2e / tsconfig.e2e.json แทน เช่นเดียวกันสำหรับการทดสอบหน่วยและ src / tsconfig.spec.json

หากไลบรารีไม่มีการพิมพ์ที่ @ types / คุณยังสามารถใช้งานได้โดยเพิ่มการพิมพ์ด้วยตนเอง:

ก่อนอื่นให้สร้างไฟล์ typings.d.ts ใน src / โฟลเดอร์ของคุณ

ไฟล์นี้จะถูกรวมโดยอัตโนมัติเป็นคำจำกัดความประเภททั่วโลก จากนั้นใน src / typings.d.ts เพิ่มรหัสต่อไปนี้:

ประกาศโมดูล 'typeless-package';

สุดท้ายในคอมโพเนนต์หรือไฟล์ที่ใช้ไลบรารีให้เพิ่มรหัสต่อไปนี้:

นำเข้า * เป็น typelessPackage จาก 'typeless-package'; typelessPackage.method ();

เสร็จสิ้น หมายเหตุ: คุณอาจต้องการหรือพบว่ามีประโยชน์ในการกำหนดการพิมพ์เพิ่มเติมสำหรับไลบรารีที่คุณพยายามใช้


ชำระเงินบทความนี้หากคุณต้องการคำแนะนำทีละขั้นตอน medium.com/@jek.bao.choo/…
wag0325

1

ฉันทำตามคำแนะนำเพื่อให้ AllowSyntheticDefaultImports (เนื่องจากไม่มีการส่งออกจากช่วงเวลาที่จะใช้สำหรับฉัน) โดยใช้ระบบ จากนั้นฉันก็ทำตามคำแนะนำของใครบางคนที่จะใช้:

import moment from 'moment';

ด้วยช่วงเวลาที่ถูกแมปในการกำหนดค่า system.js ของฉัน ข้อความนำเข้าอื่น ๆ ใช้ไม่ได้สำหรับฉันด้วยเหตุผลบางอย่าง


นี่คือคำตอบสุดท้ายในตอนนี้ แต่คำตอบเดียวที่ใช้ได้!
TJL

1

การทำงานต่อไปนี้สำหรับฉัน:

typings install dt~moment-node --save --global

ช่วงเวลา - โหนดไม่มีอยู่ในที่เก็บการพิมพ์ คุณต้องเปลี่ยนเส้นทางไปยังประเภทที่แน่นอนเพื่อให้สามารถใช้งานได้โดยใช้คำนำหน้า dt


1

ด้วย systemjs สิ่งที่ฉันทำคือภายใน systemjs.config ฉันเพิ่มแผนที่สำหรับ moment

map: {
   .....,
   'moment': 'node_modules/moment/moment.js',
   .....
}

จากนั้นคุณสามารถนำเข้าได้อย่างง่ายดายmomentเพียงแค่ทำ

import * as moment from 'moment'

1

ฉันรู้ว่ามันเป็นเธรดเก่า แต่สำหรับฉันทางออกที่ง่ายที่สุดที่ใช้งานได้จริงคือ:

  1. ติดตั้งก่อน npm install moment --save
  2. ในคอมโพเนนต์ของฉันที่ต้องการจาก node_modules และใช้มัน:
const moment = require('../../../node_modules/moment/moment.js');

@Component({...})
export class MyComponent {
   ...
   ngOnInit() {
       this.now = moment().format();
   }
   ...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.