टाइपस्क्रिप्ट के साथ क्षणों को कैसे आयात किया जा सकता है?


95

मैं टाइपस्क्रिप्ट सीखने की कोशिश कर रहा हूं। हालांकि मुझे नहीं लगता कि यह प्रासंगिक है, मैं इस डेमो के लिए VSCode का उपयोग कर रहा हूं।

मेरे पास package.jsonइसमें ये टुकड़े हैं:

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

फिर मेरे पास एक टाइपस्क्रिप्ट क्लास 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'."

यदि मैं टाइपिंग द्वारा प्रदान की गई फ़ाइल पर जाता हूं और फाइल के नीचे जोड़ता हूं:

declare module "moment" { export = moment; }

मुझे दूर जाने के लिए दूसरी त्रुटि मिल सकती है, लेकिन मुझे अभी भी अपनी main.tsफ़ाइल में काम करने के लिए पल-पल की आवश्यकता कथन की आवश्यकता है और अभी भी पहली बिल्ड त्रुटि मिल रही है।

क्या मुझे .d.tsपल के लिए अपनी फ़ाइल बनाने की आवश्यकता है या क्या कुछ सेटअप टुकड़ा है जो मुझे याद आ रहा है?


1
इस अपडेट को किसी के लिए भी import moment, { Moment } from 'moment';const x = moment();const x: Moment = moment();
जोड़ रहा है

इन समाधानों में से किसी ने भी काम नहीं किया है, मैं यहां स्थानांतरित हुआ हूं - github.com/date-fns/date-fns
chrismarx

जवाबों:


124

अपडेट करें

जाहिरा तौर पर, पल अब अपनी स्वयं की प्रकार की परिभाषाएं प्रदान करता है ( सिवाबुध के अनुसार कम से कम 2.14.1 ऊपर से), इस प्रकार आपको ज़रूरत नहीं है typingsया बिल्कुल भी नहीं @types

import * as moment from 'moment' npm पैकेज के साथ प्रदान की गई प्रकार की परिभाषाओं को लोड करना चाहिए।

हालांकि, जैसा कि कहा गया है कि पल / पुल / 3319 # जारीकरण -263752265 में कहा गया है कि टीम टीम को उन परिभाषाओं को बनाए रखने में कुछ मुद्दे हैं (वे अभी भी किसी को खोज रहे हैं जो उन्हें बनाए रखता है)


आपको ध्वज के momentबिना टाइपिंग स्थापित करने की आवश्यकता है --ambient

फिर इसका उपयोग करके शामिल करें import * as moment from 'moment'


वह काम किया। क्या आप --ambientध्वज का उपयोग करने के बीच अंतर समझा सकते हैं और नहीं? मुझे परिवेश के झंडे का उपयोग करने के लिए अंकसूची मिली। इसके अलावा, उनका मुख्य पृष्ठ npmjs.com/package/typings परिवेश ध्वज का उपयोग करके उदाहरण देता है। मुझे नहीं पता कि मैं कब / एक का उपयोग करना चाहता / चाहती हूँ। धन्यवाद!
Peinearydevelopment

1
ईमानदार होने के लिए, मैं नहीं कर सकता। आम तौर पर आप / --ambientसे सभी टाइपस्क्रिप्ट परिभाषाओं के लिए ध्वज का उपयोग करते हैं, लेकिन परिभाषा में कुछ अजीब संरचना है और फाइलें सही ढंग से डाउनलोड नहीं की जाती हैं। यदि आप परिभाषा फ़ाइल क्षण को देखते हैं। यह केवल नोड संस्करण का एक संदर्भ है, जो डाउनलोड पर हल नहीं किया गया है (एक मुद्दा खोलने के लायक हो सकता है)। typingsDefinitelyTypedmoment
सहयोगी

जाहिरा तौर पर पहले से ही इस मुद्दे से संबंधित है: github.com/DefinitelyTyped/DefinitelyTyped/issues/8388
peinearydevelopment

1
मुझे यह आयात करने के लिए काम करने में मिला * 'क्षण / क्षण' b / c से पल के रूप में इसे नोड-मॉड्यूल फ़ोल्डर में सबफ़ोल्डर के रूप में स्थापित किया गया था।
user441058

1
मैं एक वेबपैक पर हूं, और क्षण 2.17.1 संस्करण पर फिर भी इसे काम करने के लिए नहीं मिल सकता। मैंने कोशिश की: 'पल' से * आयात; और आयात * 'पल / पल' से पल के रूप में; और काम नहीं कर रहा है!
मोहि एल्डीन

59

आपको कार्य को आयात करने की आवश्यकता है () फ़ंक्शन और क्षण को अलग से TS में रखें।

मुझे यहां टाइपस्क्रिप्ट डॉक्स में एक नोट मिला ।

/ * ~ ध्यान दें कि ES6 मॉड्यूल सीधे कॉल करने योग्य कार्यों को निर्यात नहीं कर सकते हैं
* ~ इस फ़ाइल को कॉमनजस-शैली का उपयोग करके आयात किया जाना चाहिए:
* ~ आयात x = आवश्यकता ('someLibrary');

तो कोड टाइप करने के लिए js को टाइपस्क्रिप्ट में वास्तव में इस तरह दिखता है:

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

1
अच्छा जवाब क्योंकि यह प्रकार और फ़ंक्शन के बीच अंतर दिखाता है। धन्यवाद!
जेले डेन बर्गर

'25

4
अब इसका उपयोग किया जा सकता है import * as moment from 'moment';और फिर moment.Momentटाइपिंग के लिए उपयोग किया जा सकता है ।
उल्का

मेरे लिए क्या काम किया गया था: आयात क्षण = आवश्यकता ('क्षण');
पिमेंटेल मोटा

वास्तव में आप moment.Momentनेमस्पेस से सीधे इंटरफ़ेस का भी उपयोग कर सकते हैंmoment
हाफवेबडेव

20

यकीन नहीं है कि जब यह बदल गया, लेकिन टाइपस्क्रिप्ट के नवीनतम संस्करण के साथ, आपको बस उपयोग करने की आवश्यकता है import moment from 'moment'; और बाकी सब कुछ सामान्य रूप से काम करना चाहिए।

अपडेट करें:

ऐसा लग रहा है कि हाल ही में उनका आयात तय हुआ है। कम से कम 2.24.0आप उपयोग करना चाहेंगेimport * as moment from 'moment';


5
import * as moment from 'moment'टाइपस्क्रिप्ट के साथ काम नहीं करेगा लेकिन import moment from 'moment'करता है।
स्टुअर्ट मैकइंटायर

यह काम कर रहा है, लेकिन मुझे GMT 0 का समय मिल रहा है, लेकिन मुझे स्थानीय समय की आवश्यकता है जो काम नहीं कर रहा है मैं भी पल ()। Utc () प्रारूप () के साथ प्रयास कर रहा हूं लेकिन यह उसी परिणाम को पुनः प्राप्त कर रहा है।
kbhaskar

@kbhaskar पल के नवीनतम संस्करण के रूप में उन्होंने अपना आयात तय किया है। अद्यतन उत्तर देखें
NSjonas

1
मुझे लगता है कि यह बहुत ज्यादा है। एकमात्र अतिरिक्त कदम जो मुझे करना था वह मेरे कॉन्फ़िगरेशन में esModuleInteropसेट किया गया था true, जो मुझे इस उत्तर से मिला था । धन्यवाद।
मार्क बिर्बेक

14

टाइपिंग के माध्यम से

Moment.js अब v2.14.1 में टाइपस्क्रिप्ट का समर्थन करता है।

देखें: 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

हां, मैं इस बात की पुष्टि करता हूं कि यह खंडित उत्तर है। एक जादू की तरह काम किया।
केपिटी

जब मैं npm i @ प्रकार / क्षण का उपयोग करके ऐसा करने की कोशिश करता हूं, तो मुझे एक त्रुटि मिलती है: टाइपस्क्रिप्ट त्रुटि: src \ app.ts (1,1): त्रुटि TS7038: एक नाम-शैली आयात आयात या निर्माण नहीं किया जा सकता है, और इसका कारण होगा रनटाइम में एक विफलता। on
tsc

2

मैंने अभी ध्यान दिया है कि मैंने जो उत्तर दिया और टिप्पणी की वह अस्पष्ट है। तो निम्नलिखित मेरे लिए बिल्कुल काम किया है। मैं फिलहाल मोमेंट 2.26.0और टीएस पर हूं3.8.3 :

कोड में:

import moment from 'moment';

TS कॉन्फिग में:

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

मैं कॉमनजस और ईएमएस दोनों के लिए निर्माण कर रहा हूं, इसलिए यह कॉन्फिगरेशन अन्य कॉन्फिगर फाइल में इम्पोर्ट किया जाता है।

अंतर्दृष्टि इस उत्तर से आती है जो एक्सप्रेस का उपयोग करने से संबंधित है। मुझे लगा कि यह कुछ और सामान्य होने के बजाय मोमेंट.जे के संबंध में खोज करने वाले किसी भी व्यक्ति की मदद करने के लिए यहां जोड़ने लायक था।


तो आप उपयोग कर सकते हैं moment()बजाय सामान्य की तरहmoment.default()
xinthose

0

1. पल स्थापित करें

npm install moment --save

2. अपनी टाइप फ़ाइल में इस कोड का परीक्षण करें

import moment = require('moment');

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

1
टाइपस्क्रिप्ट में मॉड्यूल आयात करने का यह उचित तरीका नहीं है। कृपया अपना उत्तर अपडेट करने पर विचार करें। इसकी पुष्टि के लिए देखें: basarat.gitbook.io/typescript/project/modules/external-modules
Efe Ariaroo

0

अभी भी टूटा? अनइंस्टॉल करने की कोशिश करें @types/moment

इसलिए, मैंने फ़ाइल @types/momentसे पैकेज हटा दिया package.jsonऔर इसने काम किया:

import * as moment from 'moment'

नए संस्करणों momentको @types/momentपैकेज की आवश्यकता नहीं है क्योंकि प्रकार पहले से ही शामिल हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.