Moment: [TypeScript] "خطأ TS2304: لا يمكن العثور على اسم 'لحظة'" عند استخدامه مع "الوحدة النمطية": "لا شيء"

تم إنشاؤها على ١٤ فبراير ٢٠١٧  ·  51تعليقات  ·  مصدر: moment/moment

يبدو أن Typescript غير قادرة على حل الدالة moment() عند استخدامها في سياق غير وحدة نمطية.

إصدار tsc: 2.1.6
إصدار اللحظة: 2.17.1

Repro (بافتراض أن tsc موجود في $PATH الخاص بك):

$ mkdir repro && cd repro
$ npm i moment
$ echo 'const now = moment();' > test.ts
$ tsc --module none test.ts
test.ts(1,13): error TS2304: Cannot find name 'moment'.

ومع ذلك ، فإن استخدام نوع وحدة نمطية يعمل كما هو متوقع:

$ echo 'import * as moment from "moment"; const now = moment();' > test2.ts
$ tsc --module commonjs test2.js

لسوء الحظ ، لا يستخدم مشروعي نظام التجميع أو الوحدة النمطية ، لذلك أنا عالق مع "module": "none" في الوقت الحالي.

هل البديل الوحيد لدي لاستخدام شيء مثل typings install --save --global dt~moment ؟

TypeScript Up-For-Grabs

التعليق الأكثر فائدة

+1 الرجاء إصلاح هذا

ال 51 كومينتر

أواجه نفس المشكلة. لا يهم نوع الوحدة التي تحددها في tsconfig.json. أحصل على نفس الخطأ مثل @ crossipedia

لقد أبلغت عن نفس المشكلة (https://github.com/moment/moment/issues/3663) ، ولكن للأسف تم إغلاقها دون أي رد فعل.

انتهى بي الأمر بنسخ moment.d.ts في دليلي /scripts/app وقمت بتنفيذ الإصلاح المحدد في https://github.com/moment/moment/issues/3663#issuecomment -273199291

نأمل أن يصل الإصلاح الدائم إلى moment.d.ts النهاية.

لقد قمت بحل هذه المشكلة بتحديد "moduleResolution": "node" في ملف tsconfig الخاص بي. لست متأكدًا مما إذا كان هذا خيارًا لك يا رفاق ، ولكن يبدو أنه يقوم بالخدعة.

"moduleResolution": "node" لم يصلحها لي للأسف

crossipedia عني أيضا.

ألن تساعد إضافة export as namespace moment; إلى ملف moment.d.ts ؟

انظر: https://github.com/moment/moment/issues/3808

czb هذا أيضًا لم يصلح المشكلة بالنسبة لي ، للأسف :(

لقد قمت بحل هذا باستخدام اثنين من الاختراقات التي ذكرها الآخرون حول الكثير من المشكلات في الكثير من المشاريع التي تواجه هذه المشكلة. فقط قم بلفه في ملف تعريف مخصص خاص بك. يستخدم هذا النوع 2.2. بهذه الطريقة لا أتعامل مع التبعية التي تنزل من npmjs.org ولا يتعين علي التحقق من الأمر برمته في التحكم في المصدر.

tsconfig.json

"compilerOptions": {
    "target": "ES5",
    "moduleResolution": "node",
    ...
}

لحظة. العرف. d.ts

import * as _moment from 'moment';
export as namespace moment;
export = _moment;

لدي فضول لمعرفة سبب عدم نجاح ذلك عندما تتم إضافة هذا الرمز مباشرة إلى moment.d.ts ؟ لا يسعني إلا أن أعتقد أننا نواجه بعض الأخطاء الغامضة في دقة TypeScript ، وللأسف لا يحتوي tsc على وضع مطول (أعرفه) من شأنه أن يساعد في تحديد مكان حدوث الأخطاء.

أعتقد أنك إذا قمت بتعريف "module": "none" typscript ، فلن تبحث عن ملفات d.ts ضمن المجلد node_modules/moment . تجربتي هي أنها تبحث فقط تحت المجلد node_modules/@types . لذلك هناك في الأساس هذه الخيارات.

  1. انسخ moment.d.ts تحت node_modules/@types/moment
  2. قم بتضمين /// <reference path="./node_modules/moment/moment.d.ts" /> في ملف .ts
  3. اتصل بـ tsc --typeRoots node_modules test.ts
  4. ضع ./node_modules/moment/moment.d.ts في قسم files من tsconfig.json

تحتاج أيضًا إلى إضافة export as namespace moment; إلى ملف moment.d.ts .

سيحب فريق Moment أي علاقات عامة من شأنها إصلاح هذا الأمر ، ولكن تظل متوافقة مع TS 1.x.

ما زلت بحاجة إلى إيجاد حل يعمل على الإطلاق ، ولكن عندما أفعل ذلك ، سأكون متأكدًا من إضافة العلاقات العامة

حسب # 3663 الإصلاح المؤقت لجعله يعمل بدون أي مجمع ...

  • انسخ moment.d.ts من node_modules/moment/ إلى node_modules/@types/moment

  • تغيير export = moment; في moment.d.ts إلى

declare module "moment" {
    export = moment;
}
  • إعادة تسمية moment.d.ts إلى index.d.ts

فقط استخدم اللحظة والمحرر الخاص بك (في حالتي vscode) ولا ينبغي أن يشتكي tsc

+1 الرجاء إصلاح هذا

mtgibbs أين تضع ملف moment.custom.d.ts؟ هل هناك أي تكوين آخر يجب أن يحدث لتطبيقك للعثور على ملف custom.d.ts هذا؟

تضمين التغريدة

نعم ، أقوم بإضافتها إلى tsconfig.json . إليك مثال تم مسحه:

{
  "compilerOptions": {
    "target": "ES5",
    "moduleResolution": "node",
    "typeRoots": [
      "./node_modules/@types"
    ]
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules",
    "./path/to/typings/**/*.d.ts",
    "./typings"
  ],
  "include": [
    "./path/to/typings/moment.custom.d.ts",
    "./path/to/src/**/*.ts"
  ]
}

mtgibbs شكرا يا رجل! نقدر الرد السريع. سأجرب ذلك.

mtgibbs آسف

'moment' refers to a UMD global, but the current file is a module. Consider adding an import instead

لقد أجريت بعض الأبحاث الشخصية وحاولت تنفيذ حل عن طريق إعادة كتابة moment.custom.d.ts ولكن للأسف ، لم يحل ذلك مشكلتي.

عذرًا ، لا أحاول أن أكون أحد هؤلاء المطورين المزعجين الذين يجعلون أي شخص آخر يصحح أخطاء الكود ، فأنا خريج حديث وأنا جديد في العمل مع مكتبات الجهات الخارجية في بيئة Angular 2

ها هي الوحدة النمطية المحدثة الخاصة بي

declare var moment: any;
declare var module: NodeModule;
interface NodeModule {
    id: string;
}
import * as _moment from 'moment';
export as namespace moment;
export = _moment;

لا مشكلة. إذا كنت تستخدم Angular 2 ، فيجب أن تكون على 2.0+ TS. أنا لا أعمل في Angular لذا فأنا غير متأكد. فكر في لصق ما تستطيع من tsconfig.json وسألقي نظرة بعد أن أعود إلى جهاز كمبيوتر حقيقي.

بالتأكيد!

هذا هو ملف tsconfig.es5.json بالكامل داخل دليل src الخاص بالوحدة النمطية 2 الزاوية التي أقوم ببنائها.
أنا أقدر المساعدة بالمناسبة

{
  "compilerOptions": {
    "declaration": true,
    "module": "es2015",
    "target": "es5",
    "baseUrl": ".",
    "stripInternal": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "outDir": "../build",
    "rootDir": ".",
    "lib": [
      "es2015",
      "dom"
    ],
    "skipLibCheck": true,
    "typeRoots": [
      "./node_modules/@types"
    ]
  },
  "compileOnSave": true,
  "exclude": [
    "node_modules",
    "./typings/**/*.d.ts",
    "./typings"
  ],
  "include": [
    "./typings/moment.custom.d.ts",
    "./src/**/*.ts"
  ],
  "angularCompilerOptions": {
    "annotateForClosureCompiler": true,
    "strictMetadataEmit": true,
    "skipTemplateCodegen": true,
    "flatModuleOutFile": "new-version-library.js",
    "flatModuleId": "new-version-library"
  },
  "files": [
    "./index.ts"
  ]
}

ما هو إصدار TS الذي تقوم بتجميعه فيه؟ يجب أن تكون قادرًا على استيراد اللحظة في الأعلى دون الاختراق.

mtgibbs أنا اعتقدته . لسوء الحظ ، إنه لا يعمل. لقد وصلت إلى المرحلة التي أكتب فيها نسختي الخاصة من الوظيفة التي نأخذها من momentjs ، لأنني لا أستطيع على ما يبدو أن أجعل هذا يعمل.

تضمين التغريدة

حسنًا ، أعود إلى هنا. لقد لاحظت أنك قلت إنك قمت بعمل مخصص module.custom.d.ts ، لكنك بعد ذلك أشرت إلى moment.custom.d.ts في tsconfig.json . تأكد من أنك ربحت moment.custom.d.ts وقمت بإضافته إلى المترجم الخاص بك ، لا شيء من تلك الأشياء الإضافية التي كنت قد أعلنت عنها أشياء. ثم تأكد من الرجوع إليه في أعلى الملف الذي تريد استخدامه فيه.

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

يجب أن يسمح لك هذا بالإشارة إليه كمتغير عام كما في الحل الأصلي الخاص بي.

رائع شكرا لك mtgibbs ! انا حقا اقدر المساعدة.
لقد غيرت بنية ملفي لدعم مساراتك. لذا فهذه هي المسارات الصحيحة.
في صحتك يا صديقي!

هذا يناسبني:

  • التعليق خارج // export = moment في ملف moment.d.ts الرسمي
  • أضف node_modules/moment/moment.d.ts إلى tsconfig.json

بالتناوب ، انسخ moment.d.ts المعدل إلى موقع من اختيارك وأضف المسار إليه في tsconfig.json

أعتقد أن المشكلة الرئيسية هي أنه عند استخدام "module":"none" صريح في tsconfig.json ، لا يمكنك الحصول على أي استيراد أو تصدير من المستوى الأعلى في أي مكتبات (لأنك تستخدم الوحدات النمطية بعد ذلك).

يجب عليك أولاً الاستيراد في المكون كـ
استيراد * كلحظة من "لحظة" ؛

عملت بشكل جيد معي

يجب عليك أولاً الاستيراد في المكون كـ
استيراد * كلحظة من "لحظة" ؛
عملت بشكل جيد معي

إذا قمت بذلك في ملف ، فسيتم تعطيل دقة مساحة الاسم لتلك الملفات.

الرجاء الرجال +1 لإصلاح هذا

لماذا لا تصلح هذه المشكلة؟ انها مهمة جدا.

إضافة "module": "commonjs" إلى tsconfig.json إصلاحه لي

لكن لا بد لي من استخدام "module": "none" . Commonjs ليس حلا.

إذا فهمت ذلك بشكل صحيح ، فسيتم حل ذلك باستخدام ميزة أنواع استيراد TypeScript 2.9 ، والتي ستسمح بتعريفات النوع import ing دون التأثير على الوحدة النمطية / السياق المحيط.

أنا أستخدم TS 3.0.1 ، هل تم حل هذه المشكلة الآن؟ إنه لا يعمل خارج الصندوق على الأقل.

EDIT ، مع TS 3.0.1 يمكنني فعل هذا فقط:

declare var moment: typeof import("moment");

يا هلا!

مع tsconfig

{
    "compilerOptions": {
        "module": "none"
        "moduleResolution": "node", 
        // ...
    }
}

يبدو أن TS 3.0.1 يعمل على حل هذه المشكلة (وقد كان مفتوحًا لأكثر من عام ونصف بدون أي جر)

مرحبا rossipedia ،
أواجه نفس المشكلة في مشروع angular-6. وفقًا لتعليقاتك ، تم حله في TS 3.0.1 لكن angular6 CLI لا يدعم TypeScript الإصدار 3.0.1.

هل يمكنك المساعدة في حل هذه المشكلة؟

هل واجه أي شخص آخر حزمة @types/moment npm وهي مجرد كعب ويخبرك باستخدام الملف الذي توفره الحزمة العادية؟

... لماذا يجب على Mom أن يفعل ذلك بشكل مختلف مقارنة بأي حزمة أخرى؟ هذا هو سبب وجود هذه المشكلة ، وقد قضى المطورون آلاف الساعات في حل هذه المشكلة.

بالتأكيد ، يعمل حل Ciantic في TS 3.0.1 ، لكن لا يتعين علي استخدام شيء مثل declare var moment: typeof import("moment"); لأي من الحزم الأخرى التي أستخدمها.

لا يبدو أن Typescript 3.0.1 تعمل على إصلاح هذه المشكلة ، يبدو أنها تعطينا حلًا بديلًا.

يبدو أنه يقدم لنا الحل.

نعم ، هذا بالضبط. هذا ليس "إصلاح" مقبول.

لقد مر يومًا فقط وأدركت للتو أن حل TS 3.0.1 يستورد وظيفة moment ، وليس مساحة الاسم / الأنواع. لذلك إذا كنت تريد تمرير كائن لحظة إلى دالة ، يحدث هذا:

image

الرجاء إعادة فتح هذه المشكلة ، أو الأفضل: إصلاح ملف dts.

ليس حلاً للمشكلة الأصلية ، ولكن بالنسبة للأشخاص الذين يبحثون عن ذلك لاحقًا على googling: تم إصلاح ما يلي في tsconfig.json (نص مطبوع 3.3.3 ولحظة 2.24.0)

{
  "compilerOptions": {
    "module": "commonjs"
  }
}

لم أعد أستخدم اللحظة كثيرًا هذه الأيام ، لكنني سعيد بإعادة فتح المشكلة إذا كانت لا تزال صالحة.

خطأ في src / app / services / get-list.service.ts (22،54): خطأ TS2304: لا يمكن العثور على الاسم "_".

ما الحل لهذا ؟؟

nagipogu لا يوجد حل لذلك ، هذه المشكلة خاصة بـ moment.js ، يرجى فتح مشكلتك في مستودع Github الخاص بـ Undcore.js .

أواجه هذه المشكلة مع أحدث إصدار من لحظة مع أحدث إصدار من TS. هل لدى أي شخص أي حل بديل ناجح؟

ما زلت لا تعمل ، كان الحل بالنسبة لي هو yarn add -W [email protected] .

عندما قمت بتثبيت أحدث إصدار لحظة ونظرت في node_modules / moment / package.json ، رأيت هذا: https://github.com/moment/moment/blob/develop/package.json#L29 - لكن لم يكن هناك دليل موجود node_modules/moment/ts3.1-typings ، لذلك ليس من المستغرب أن TS coudl لم يعثر عليه. أعتقد أنه قد يكون هناك بعض الأخطاء في برنامج نصي للتثبيت (أو حزمة) أو نحو ذلك. نعم ، لدينا "module": "esnext" في tsconfig.json.

بالنسبة لي كسر 2.25.0:

لقد استخدمت pnpm add [email protected] كحل مؤقت.

بالنسبة لي كسر 2.25.0:

لقد استخدمت pnpm add [email protected] كحل مؤقت.

عمل جيد ، شكرا لك

بالنسبة لي كسر 2.25.0:

لقد استخدمت pnpm add [email protected] كحل مؤقت.

أضافها أيضًا هنا إلى: "التبعيات" {"moment": "^ 2.24.0"،
} ... يبدو أنه يعمل شكرا لك.

خفضت إلى 2.24.0 عملت أيضا بالنسبة لي. يبدو وكأنه تراجع في 2.25.0.

2.25.3 هل يصلح مشاكلك؟

هناك العديد من أنواع المواقف المختلفة التي يتم فيها استخدام Moment.js ، ناهيك عن TS 1.x و TS 2.x و TS 3.x ...
أنا متردد في إجراء تغييرات تكسر أي مجموعة من هؤلاء المستخدمين.

إذا كنت تعتقد أنه يمكن تحسين الوثائق ، فيرجى النشر على https://github.com/moment/momentjs.com/

2.25.3 هل يصلح مشاكلك؟

نعم.

تراجعت إلى 2.24.0 عندما فشلت 2.25.1 بالنسبة لي في Angular 9. مع 2.25.3 ، تعود إلى المسار الصحيح مرة أخرى.

حسنا عظيم. سأغلق الآن.

الرجاء إعادة فتح (أو فتح مشكلة جديدة) إذا كان لا يزال لديك مخاوف.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

M-Zuber picture M-Zuber  ·  3تعليقات

benhathaway picture benhathaway  ·  3تعليقات

dbshwang picture dbshwang  ·  3تعليقات

vbullinger picture vbullinger  ·  3تعليقات

alvarotrigo picture alvarotrigo  ·  3تعليقات