Typescript: دعم البحث عن وحدات ضمن node_modules عند الاستيراد

تم إنشاؤها على ٢٥ يوليو ٢٠١٤  ·  138تعليقات  ·  مصدر: microsoft/TypeScript

تحديث 5 نوفمبر 2015

يتم تنفيذ الوظيفة المطلوبة أدناه حاليًا في الكتابة المطبوعة منذ 1.8 على الأقل مع اختلاف رئيسي واحد:

بدلاً من امتلاك خصائص typescript.main و typescript.definition ، هناك خاصية typings واحدة فقط يمكنك الإشارة إلى ملف d.ts أو إلى .ts عادي

إذا كنت تقوم بتطوير وحدة لتستخدمها محليًا فقط ، فيمكنك الحصول على typings أشر إلى ملف .ts ، ولكن إذا كنت تخطط لنشر الوحدة ، فمن المستحسن جعلها تشير إلى ملف d.ts . هذا لأنك لا تريد أن يقوم مستهلكو الوحدة الخاصة بك بإعادة تجميع ملفات الوحدة الخاصة بك ، فقط قم باستهلاك كتاباتها.

لقد قمت بإعداد مثال لاستخدام هذا هنا:
https://github.com/chanon/typescript_module_example

توجد هنا صفحة توثيق تحتوي على مزيد من المعلومات:
http://www.typescriptlang.org/docs/handbook/typings-for-npm-packages.html

شكرا لك مطوري TypeScript وجميع المساهمين.

يتبع الإصدار الأصلي / طلب الميزة


تحفيز

في TypeScript ، يكون من الصعب جدًا إعادة استخدام وحدات الكتابة المطبوعة مقارنةً بإعادة استخدام وحدات npm في JavaScript.

قد يكون من المفيد أن يكون المترجم المنسوب ذكيًا بما يكفي للبحث في مجلدات node_modules وملفات package.json.

والسبب هو أن مطوري وحدات npm الذين يستخدمون TypeScript قد يتمكنون من البدء في كتابة الوحدات وتوزيعها من خلال npm نفسها. سيكون TypeScript قادرًا على دعم البنية التحتية لـ npm على نطاق واسع.

مثال على node_modules

لو كنا نملك:

./node_modules/concator/index.ts
./myApp.ts

وفي index.ts كان لدينا:

export function concat(param1: string, param2:string): string {
      return param1 + ' ' + param2;
}

في myApp.ts:

import concator = require('concator');  // loads the module from node_modules
var result = concator.concat('I like', 'this.');
var wontWork = concator.concat('this will fail');  // compile error, concat needs 2 params

لذلك ، فإن المترجم ذكي بما يكفي للعثور على الوحدة في node_modules ويستخدم تلقائيًا الإصدار المطبوع (index.ts).

ثم عندما يتم تجميع الكود إلى JavaScript ، فإنه يستخدم بشكل طبيعي إصدار JavaScript.

استيراد المجلدات كوحدات نمطية

هناك حالة أساسية أكثر هي دعم قاعدة Node.js الشائعة لـ http://nodejs.org/api/modules.html#modules_folders_as_modules كما هو مقترح بواسطة vvakame أدناه وفي العدد 207 مغلق (شبه مكرر).

أنواع نصوص مكتوبة في package.json

يمكن أن تكون هناك إضافة إلى ملفات package.json لتحديد مكان ملف .ts الرئيسي لوحدة TypeScript npm. قد يكون هذا مشابهًا للمفتاح main الذي يحدد مكان وجود ملف JavaScript / .js الرئيسي ولكن لـ TypeScript بدلاً من ذلك.

على سبيل المثال ، package.json لوحدة npm تسمى "myModule" وتقع في node_modules/myModule/package.json

{
     "main": "./dist/index.js",
     "typescript": {
          "main": "./src/index.ts"
     }
}

في هذا المثال ، سيكون node_modules/myModule/src/index.ts هو ملف TypeScript الرئيسي وسيؤدي تنفيذ import myModule = require("myModule"); إلى استيراد الملف node_modules/myModule/src/index.ts .

بالنسبة لمبرمج JavaScript يكتب var myModule = require("myModule"); في ملف JavaScript ، فإن المطلوب تحميل الملف node_modules/myModule/dist/index.js كالمعتاد.

كما يتضح في هذا المثال ، يوجد TypeScript src في المجلد node_modules/module-name/src وستكون ملفات JS المترجمة في node_modules/module-name/dist .

شيء من هذا القبيل يمكن أن يكون معيارًا (شبه) لوحدات TypeScript npm النمطية بحيث يتم فصل مصدر TypeScript تمامًا عن مخرجات JavaScript المترجمة.

هناك حالة أساسية أكثر كما اقترحها vvakame أدناه وهي دعم قاعدة Node.js الشائعة http://nodejs.org/api/modules.html#modules_folders_as_module

typecript.definition في package.json

مفتاح آخر محتمل لـ package.json لوحدات npm غير TypeScript (عادي JavaScript) يمكن أن يكون typescript.definition . قد يشير هذا إلى ملف .d.ts الذي يعرّف الوحدة النمطية لمستخدمي TypeScript للوحدة النمطية npm.

بحيث أن
import $ = require('jquery');
سيقرأ تلقائيًا ملف jquery.d.ts المحدد في المفتاح typescript.definition في package.json الخاص بـ jQuery وجعل $ هو النوع الصحيح.

تنسيق المثال:

{
     "main": "./dist/index.js",
     "typescript": {
          "definition": "./index.d.ts"
     }
}

(هذا التنسيق مستخدم بالفعل بواسطة tsd كما يوضح Bartvds أدناه.)

ثم يتعين على مبرمجي TypeScript لنا محاولة الحصول على أكبر عدد ممكن من المشرفين على وحدات npm التي لا تنتمي إلى TypeScript لدمج طلبات السحب التي تحتوي على ملفات .d.ts ومفاتيح package.json typescript.definition .

إذا نجحنا في ذلك ، فستكون حياة مبرمجي TypeScript نعمة ... لن تكون هناك إدارة منفصلة لملفات .d.ts من نوع DefinitelyTyped. فقط قم بتثبيت npm وستحصل على تعريفات TypeScript أيضًا! تلقائيًا ومحدّثة مع تثبيت إصدار الوحدة.

قائمة الفوائد

ما نحصل عليه من كل هذا هو

  • يمكن كتابة وحدات npm في TypeScript.
  • يمكن لمبرمجي TypeScript و JavaScript استخدام هذه الوحدات
  • يحصل مستخدمو الوحدة النمطية الذين يستخدمون TypeScript على مزايا الكتابة الثابتة دون الحاجة إلى استخدام مبرمج الوحدة (أو المستخدم) للطريقة المعتادة لكتابة (أو إنشاء) ملفات .d.ts منفصلة (لذلك عندما يكون رمز مصدر الوحدة موجودًا بالفعل في TypeScript ليس علينا الاحتفاظ بملف d.ts آخر)
  • ستكون هناك طريقة لإعادة استخدام وحدات TypeScript النمطية وتوزيعها بسهولة باستخدام npm والتي يعرفها الجميع بالفعل
  • يمكن أن يساعد في تعزيز استخدام TypeScript نفسه ، حيث قد يرى مبرمجو JavaScript الذين يستخدمون وحدات npm المكتوبة في TypeScript مدى جودة / تحسين مصدر TypeScript ومحاولة التبديل إليه. أو قد يرغبون في المساهمة في الوحدة النمطية وبما أن المصدر موجود في TypeScript ، فسيتعين عليهم تعلمه مما قد يدفعهم إلى الإعجاب به واتخاذ قرار باستخدامه في مشاريعهم الخاصة.
  • سيساعد بشكل أساسي على تنمية مجتمع TypeScript من خلال جميع عمليات مشاركة التعليمات البرمجية التي يمكن أن تنتج. في الوقت الحالي ، تعد شفرة TypeScript لكل شخص في الغالب خاصة بهم / في صومعتهم الخاصة. ربما يكون هذا في الواقع أمرًا مهمًا للغاية لأن عدم وجود طريقة مناسبة / سهلة لمشاركة / توزيع / إعادة استخدام الوحدات النمطية ربما يحد من نمو اللغة. [1]
  • إعادة استخدام الوحدات النمطية في المشاريع الداخلية سيكون أقل بكثير من المتاعب وسيقلل من الحاجة إلى كل تلك المسارات النسبية لملفات .d.ts والمسارات النسبية في الوحدة النمطية ، وأشياء .d.ts العامة. (الآن عند كتابة كود TypeScript ، أجد أنه يجب أن أتعلم كيف أكون جيدًا في العد ../../ ق)
  • يدعم هذا الأسلوب أيضًا Browserify / Webpack حيث يبحث Browserify / Webpack أيضًا تحت وحدات_عقدة ، لذلك يسمح هذا بوحدات TypeScript الموزعة القابلة لإعادة الاستخدام / npm لكل من الخادم والمستعرض
  • يمكن بسهولة استخدام الوحدات النمطية non-TypeScript npm في TypeScript مع معلومات النوع من خلال إضافة المفتاح typescript.definition . يسمح هذا بتجميع ملفات تعريف d.ts مع الوحدة النمطية npm بحيث يؤدي تحديث وحدة npm إلى تحديث ملف تعريف .d.ts تلقائيًا. هذا يزيل الحاجة إلى تحديث ملفات .d.ts يدويًا.
  • يعد استخدام ملفات التعريف من خلال typescript.definition أبسط لأنه ببساطة عبارة import moduleName = require("moduleName") بدون الحاجة إلى ///<reference ... منفصل
  • يجب أن يسمح استخدام ملفات التعريف من خلال typescript.definition أيضًا باستخدام إصدارات مختلفة من الوحدة النمطية في نفس قاعدة التعليمات البرمجية دون تعارض أسماء الأنواع.

اقتراح مفصل

كتب @ Nemo157 اقتراحًا تفصيليًا للغاية حول كيفية عمل كل هذا في:

تتطلب TypeScript المقترحة دلالات الحل
https://gist.github.com/Nemo157/f20064a282ee620f3877

إضافة في الاقتراح هي استخدام مجلدات /typings التي يمكنها الاحتفاظ بملفات تعريف يمكن إدارتها تلقائيًا بواسطة أدوات مثل tsd لوحدات JavaScript npm النمطية التي لا تتضمن ملفات تعريف في مستودعاتها .

حقائق داعمة نهائية

نظرًا لأن TypeScript يجمع إلى JavaScript والذي يعمل بشكل أساسي في مكانين: node.js وفي المتصفحات ، فإن دعم node_modules مفيد لكلا المكانين (عمليا كل الأماكن التي يتم فيها استخدام TypeScript) بسبب npm و Browserify / Webpack.

بمعنى آخر. لا يوجد سبب للتوصل إلى مخطط مختلف عندما تكون node_modules هي ما يستخدمه جميع مستخدمي TypeScript بالفعل ربما بنسبة 75٪ -100٪ من جميع أكواد JavaScript الخاصة بهم. (أخذ 25٪ ربما تتطلب مستخدمي JS.)

الحواشي

[1] - راجع للشغل أرى أن هناك مدير حزم NuGet (؟) من Microsoft يمكنه توزيع وحدات مطبوعة (؟) ، ولكن قادمًا من خلفية node.js مركزة (غير مركزة على .NET) ، لا أرى أن NuGet أصبح يستخدم على نطاق واسع خارج المتاجر التي تركز على Microsoft ، خاصة وأن npm هو _the_ القياسي لـ node.js وهو معيار رائد لجافا سكريبت من جانب العميل أيضًا. إذا لم أستخدم TypeScript ، فلن أسمع عن NuGet. من المحتمل أن يفضل مبرمج JavaScript من جانب node.js / العميل المتوسط ​​استخدام npm ، وهي نفس الأداة التي يستخدمونها بالفعل بدلاً من الاضطرار إلى استخدام شيء خاص بشركة Microsoft مثل NuGet. (لا أعرف شيئًا عن NuGet ، لذا فإن ما أقوله هنا قد لا يكون مهمًا في الواقع.)

Committed Suggestion

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

على أي حال ، يدعي المترجم حاليًا أنه لا يمكنه العثور على الوحدة ، في حين أنه في الواقع يرفض استيراد الوحدة بدون تعريف النوع. هذا ليس مفيدًا حقًا ، أليس كذلك؟

ال 138 كومينتر

[تم النقل إلى typecript.main في package.json في وصف المشكلة أعلاه]

: +1:
أعتقد أن http://nodejs.org/api/modules.html#modules_folders_as_modules قاعدة شائعة جدًا في Node.js.

مثال آخر.

./test/index.ts

export function hello() { return "Hello, world"; }

./main.ts

import test = require("./test/");
console.log(test.hello()); // print "Hello, world"

[تم النقل إلى typecript.definition في package.json في وصف المشكلة أعلاه]

سيكون أحد الحلول هو حلها باستخدام أدوات أفضل. على سبيل المثال ، يمنحك import foo = require('foo') تلميحًا للبحث عن بعض node_module + package.json المحلية (foo هو مشروع ts) أو تعريف DT (foo هو مشروع js حيث لا يرغب مؤلفو المكتبة في الحفاظ على ts def) .

لمعلوماتك؛ أنا في الواقع أختبر شيئًا مشابهًا لهذا في TSD ؛ طريقة لعرض وربط التعريفات المجمعة في حزم npm (أو bower).

إنه موجود في إصدار dev الخاص بي لـ 0.6 ، ويعمل عن طريق إضافة عنصر typescript إلى package.json (أو bower.json) ، مع عنصر فرعي definition (عنصر فرعي ربما يكون واحدًا اليوم سيكون هناك source أيضًا ، أو أيًا كان).

{
    ...
    "main": "./index.js",
    "typescript": {
        "definition": "./foo.d.ts"
    }
    ...
},

ثم يمكنك تشغيل أمر على TSD ، حاليًا tsd link وسيقوم بفحص جميع ملفات package.json في node_modules (أو bower أو أيًا كان) ، ابحث عن هذه الخاصية إذا تم تعريفها وأضف مرجعًا إليها إلى tsd.d.ts المركزي حزمة

مثال: تم تعريفه هنا واستخدامه هنا

تضمين التغريدة يمكن أن تكون الخطوة الأولى لوجود .d.ts في حزم npm. تعجبني بنية package.json مع "تعريف" في "نص مطبوع" ، فهي أكثر تنظيماً.

إذا كان مترجم TypeScript نفسه يمكنه قراءته تلقائيًا ، فسيكون رائعًا جدًا.

وضع علامة على هذا للمناقشة - الحل الأكثر ذكاءً للوحدة الخارجية هو شيء نحتاج إلى التحدث عنه لفهم السيناريوهات المختلفة هنا. تم طرح هذا سابقًا وقمنا بإجراء بعض التعديلات في الإصدار 1.0.

ناقش أيضًا # 207 - البحث تحت "الفهرس"

: +1:

chanon tsMain ليس ضروريًا إذا استخدمنا إنشاء الإقرارات.

نعم ، هذه المشكلة مهمة للغاية حتى بالنسبة للمتصفحات - تستخدم الكثير من المشاريع browserify / packify وبالتالي تخطيطات الدليل المتوافقة مع العقدة

: +1:

كان هناك بعض العمل بالفعل في هذا المجال مرة أخرى في codeplex repo ، طلب سحب واحد بواسطة leebyron وآخر بواسطة kayahr .

كنت أقصد محاولة نقل أحدهم إلى المستودع الجديد ، لكن يبدو أنه تمت إعادة ترتيب الكود ذي الصلة كثيرًا.

لقد كتبت اقتراحًا حول كيفية إضافة هذا إلى مترجم TypeScript . يتضمن هذا أيضًا البحث في الدليل typings حيث سيكون ذلك مهمًا عند العمل مع وحدات جافا سكريبت التي لن تحتفظ بتعريفات الحروف المطبوعة الخاصة بها. لسوء الحظ ، لجعل كل هذا العمل بشفافية مع tsd سيستمر القليل من العمل لأن متطلبات /// <reference d الملفات تجعل الأمور صعبة بعض الشيء. سوف ألقي نظرة على تنفيذ هذا على أحد الفروع وتقديم بعض نماذج الوحدات النمطية التي تستخدمه.

تبدو معقولة. هل سيغطي هذا الوحدات النمطية ذات التبعيات من النوع المتضارب؟ أعني أنه إذا كان التطبيق يستورد A و B ، ويعتمد B أيضًا على A. فمن السهل الوقوع في أخطاء النوع المكرر إذا كانت هناك نسختان من الإقرارات الخارجية.

لا ينبغي ، يجب عليهم حل أسماء وحدات خارجية مختلفة بحيث يعلنون عن أنواع مستقلة مسماة بشكل متماثل في وحدات مختلفة. يجب أن يسمح فحص النوع الهيكلي للوحدات النمطية المختلفة بالتفاعل دون مشاكل.

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

joewood أيضًا ستكون هناك مشاكل بين الإصدارات المختلفة من A

├── [email protected]
└── [email protected]
    └── [email protected]

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

مهتم بسماع الحلول لنفسه. يحتوي TypeScript على نطاق متغير على مستوى global للإعلانات المحيطة

حتى إذا كانت الإصدارات متطابقة ، في الوقت الحالي ، أرى مشكلات في ملفين مختلفين ، لكنهما متطابقان مع ملف التصريح المحيط ، مما يتسبب في حدوث أخطاء في الرموز المكررة. يحتاج التوجيه المحدد محليًا /// reference إلى حل بطريقة ما إلى ملف واحد. إما ذلك ، أو يجب أن تتضمن هوية النوع المسار ، وستتولى الكتابة الهيكلية الاهتمام بحالات عدم تطابق الإصدار وما إلى ذلك.

joewood Yep ، هذا ما آمل أن يتم إصلاحه في معظم الحالات بتغيير require لتحميل التعريفات الصحيحة ، وتجنب /// reference كلما أمكن ذلك. سيتم تحديد الوحدات الخارجية من خلال مساراتها المطلقة بدلاً من وجود إعلانات محيطة ، لذا من المفترض أن يكون تحميل العديد من نفس الاسم من مسارات مختلفة وفي إصدارات مختلفة أمرًا ممكنًا.

نعم ، هذا ما آمل أن يتم إصلاحه في معظم الحالات عن طريق تغيير يتطلب تحميل التعريفات الصحيحة ، وتجنب /// المرجع حيثما أمكن ذلك.

: +1:

: +1: شكرًا @ Nemo157 والجميع على المناقشة.

لقد قمت بتحديث نص العدد الأعلى لدمج إضافات package.json وربطها بمقترح @ Nemo157 .

: +1:

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

: +1:

المجلدات كوحدات نمطية مع index.ts: +1:

: +1:

: +1:

: +1:

: +1:

: +1:: +1:: +1:

: +1:: +1:: +1:: +1:

تعليقًا على إعادة هذا إلى الرادار الخاص بنا.

لقد حققت نجاحًا جيدًا مع اقتراح Bartvds :

ثم يمكنك تشغيل أمر على TSD ، رابط tsd حاليًا وسيقوم بفحص جميع ملفات package.json في node_modules (أو bower أو أيًا كان) ، والعثور على هذه الخاصية إذا تم تحديدها وإضافة مرجع إليها إلى حزمة tsd.d.ts المركزية في مشروعك.

لذا فكر بالتأكيد في دعم typescript بـ package.json لأن هذه هي الطريقة التي ذهب بها المجتمع.

نحتاج بالتأكيد إلى tsc لتكون على دراية بالمجلد node_modules إذا كان TypeScript سيُستخدم على نطاق واسع في مجتمع node.js. أستخدم حاليًا ارتباطات رمزية للوحدات النمطية التي تعد جزءًا من مشروع التطوير الخاص بي (باستخدام مساحة عمل npm) ، ولدي خياران في الوقت الحالي:

  • الاستيراد مباشرة من node_modules ، والذي يبدو خاطئًا: import Foo = require("node_modules/mymodule/Foo");
  • الحصول على tsc لإنشاء ملفات التصريح ثم تجميعها معًا باستخدام ملف إعلان الوحدة الذي يتم الاحتفاظ به يدويًا والذي يقوم بالتبديل عبر أسماء وحدات السلسلة

هل يمكن أن يتحقق tsc من اسم الوحدة الخارجية في إقرارات الاستيراد ثم أثناء دقة المسار ، يطبق أيضًا node_modules بنفس الطريقة التي يستخدمها وقت تشغيل node.js؟ يمكن لخيار المترجم أيضًا تشغيل هذا أو إيقاف تشغيله.

: +1:: +1:: +1:

يمكن أن يتحقق tsc من اسم الوحدة الخارجية في تعريفات الاستيراد ، ثم أثناء دقة المسار ، يطبق أيضًا node_modules بنفس الطريقة التي يستخدمها وقت تشغيل node.js

هكذا يجب أن يكون. الطريقة الحالية للبحث فقط في شجرة الدليل للعثور على ملف بالاسم المذكور لا تظهر أي تشابه مع سياقات تنفيذ JS.

كان هذا في قائمتي لفترة من الوقت الآن. سيحاول الحصول على هذا في الإصدار القادم.

نحن ( Booktrack ) نستخدم TypeScript لجميع عمليات تطوير الويب الخاصة بنا ، ونواجه تحديات مماثلة لمطوري node.js. أتحدث لأن صوت مطوري الويب لا يبدو مرتفعًا مثل صوت مطوري العقدة.

الحلول (بالترتيب بين الأسوأ بالنسبة لنا والأفضل لنا):

  1. دقة أسماء الوحدات الخارجية ذات المستوى الأعلى عبر البحث المشفر إلى node_modules
  2. لا يوجد تحكم في دقة أسماء الوحدات الخارجية ذات المستوى الأعلى
  3. علامة مترجم للتحكم في الدقة الاختيارية لأسماء الوحدات الخارجية ذات المستوى الأعلى في الدليل node_modules
  4. معلمة "مسار (مسارات) بحث الوحدة النمطية" للمترجم للتحكم في الدقة الاختيارية لأسماء الوحدات الخارجية ذات المستوى الأعلى في المسار (المسارات) المحدد
  5. معلمة "محلل الوحدة النمطية" للمترجم لتزويد المحول البرمجي بملحق JS الذي سيحل جميع أسماء الوحدات الخارجية (وليس المستوى الأعلى فقط)
  6. الخطافات المناسبة في خدمات اللغة بحيث يمكن التحكم في دقة اسم الوحدة الخارجية

الخيار 1 فظيع ، أفضل الخيار 2.

سيسمح الخياران 5 و 6 بالاستخدامات الغريبة لبيانات الاستيراد ، مثل تلك التي تم العثور عليها عند العمل مع أدوات requestjs أو webpack الإضافية. الفكرة الأساسية: يقوم المترجم بتفويض جميع عمليات البحث عن اسم الوحدة الخارجية (وليس المستوى الأعلى فقط) لطرف ثالث (مكون إضافي أو رد اتصال). المفوض ، بالنظر إلى المسار إلى الوحدة النمطية تحت الترجمة واسم الوحدة الخارجية ، يعود إلى المترجم مسار نظام الملفات أو معلومات النوع لاسم الوحدة المعطى.

سأكون سعيدًا إذا تم تنفيذ الخيار 4 ، وسأكون سعيدًا إذا تم تنفيذ الخيار 6 وفوق القمر إذا تم تنفيذ الخيار 4 والخيار 6.

ماذا عن --basePath لجذر بحث الوحدة النمطية الخاصة بك ، سيتم النظر إلى جميع واردات الوحدة النمطية بالنسبة لذلك المسار. هذا ينطبق فقط على AMD.

أعتقد أن مشكلة العقدة أبسط بكثير ، نحتاج فقط إلى تضمينها :)

لاحظ أننا حصلنا بالفعل على تنفيذ (واختبارات) من @ Nemo157 هنا منذ فترة طويلة https://github.com/Microsoft/TypeScript/issues/247#issuecomment -57422329

اتفق مع @ mark-buer و mhegazy ، الخيار 4 يجب أن يكون مسار البحث إصلاحًا بسيطًا. مطلوب بالتأكيد حل أكثر تفصيلاً في خدمة اللغة (الخيار 6) على المدى الطويل.

_ يستحق الإضافة_: هذا وحده لن يحل مشكلة إعادة استخدام TypeScript في npm بسبب مشكلة الرمز المكرر لمراجع النوع الشائعة # 1125. نحتاج حقًا إلى تجنب ///باستخدام ملفات .tsconfig وإصلاح هذا الأمر بشكل صحيح عن طريق تجميع الحزم في وحدة نمطية خارجية واحدة مطبوعة كما هو مقترح في # 17

تصويت آخر للحصول على مجلد node_modules يتعرف عليه المترجم المنسوخ.

بالنسبة لوحدات CommonJS النمطية ، يجب أن تتبع الكتابة المطبوعة نفس دقة اسم الملف التي تتطلب حلًا (كما هو موضح بواسطة كود psuedocode في هذه الصفحة: http://nodejs.org/api/modules.html#modules_all_together.

هذه الوظيفة ضرورية للسماح بدمج المترجم المنسوخ في برامج تجميع العقدة الأخرى ، مثل browserify. يقوم التصحيح @ Nemo157 بعمل جيد ، لكنه لا يسمح باختبار سهل مع الحزم الموجودة حيث انتقل معظمهم إلى الإصدارات الأحدث من الكتابة المطبوعة ولم يعد متوافقًا مع الكود الخاص به

أين يجب أن يكون الدليل node_modules ذو صلة بالمصادر؟

يدعم Atom-TypeScript الآن typescript.definition خارج الصندوق. التفاصيل: https://github.com/Microsoft/TypeScript/issues/2829

يمكنك أيضًا إنشاء مثل هذه الحزم بسهولة باستخدام atom-typecript: rose: مرة أخرى راجع # 2829

التقييد

ستعمل _ بلا أخطاء_ إذا قمت بمشاركة حزمة لا تعتمد على أي مكتبات خارجية. إذا كان الأمر كذلك ، فنحن بحاجة إلى خوارزمية حل نزاع الوحدة.

أنا منفتح على الاقتراحات لهذه الحالة ، لكن خطتي هي:

  • نقوم ببعض الأشياء الذكية في قراءة مثل d.ts لا نعطي TypeScript التعليقات الخارجية reference (على سبيل المثال node.d.ts هنا https://github.com/TypeStrong/atom-typescript-examples / blob / master / node / node_modules / example-typescript-b / definition / sample-bdts) وبدلاً من ذلك نشير إلى .d.ts إذا كان لدينا في كتاباتنا.

هل سيبقى هذا على المسار الصحيح لـ 2.0؟ يبدو أنه نوع من الميزات المهمة لاعتماد Node.js ، وهو أمر مؤلم في الوقت الحالي ، حتى مع DefinitelyTyped وإعجاباته.

يبدو أنه نوع من الميزات المهمة لاعتماد Node.js ، وهو أمر مؤلم في الوقت الحالي ، حتى مع DefinitelyTyped وإعجاباته.

LPGhatguy الرجاء مراجعة https://github.com/Microsoft/TypeScript/issues/2338. تعمل vladima على ذلك ولكن لا تعتقد أنه تم تخصيص أي معلم رئيسي لها حتى الآن: rose:

LPGhatguy نحاول الحصول على هذا في الإصدار القادم. آمل قريبا.

mhegazy تقصد 1.6؟ سيكون هذا رائعا!

هل هذا متعلق بـ # 2338؟

نعم لـ TypeScript 1.6 (على الأقل هذا ما نحاول القيام به) ، نعم لـ # 2338 ؛ هناك بعض التغييرات والمشكلات الأخرى حول هذا الأمر بما في ذلك # 3147 و # 4154

إذن ، لماذا تم وضع علامة عليها على أنها TypeScript 2.0 كمحطة رئيسية؟

شكرا heycalmdown ، إزالة المعلم. نحن لا نضع علامات على المعالم في الاقتراحات. نأمل أن يكون لدينا تحديث في غضون أسبوع أو نحو ذلك حول هذه المسألة. ابقوا متابعين.

أرغب في طلب دعم وحدة ES6 لمتابعة هذا أيضًا (وهو ما أفترض أنه سيفعل ذلك؟)

كتابة ل

import mylib = require('mylib');
mylib.foo(mylib.bar);

يجب أن تتصرف مثل

import { foo, bar } from 'mylib';
foo(bar);

أرغب في طلب دعم وحدة ES6 لمتابعة هذا أيضًا (وهو ما أفترضه؟

تضمين التغريدة البحث بين الاثنين متسق: ارتفع:

يتم التعامل مع هذا بواسطة # 4154.

إذا كنت أستخدم ليلاً ، فابتداءً من الغد ، يجب أن أتوقع استيراد وحدات العقدة "للعمل فقط"؟

سؤال:
أعتقد أنه من الاصطلاح الشائع أن يتم تسمية الملفات
"الفهرس" في ملفات JS و
"الرئيسي" في AMD
لمسارات قصيرة.
في السؤال على رأس المؤلف يستورد
/node_modules/concator/index.ts مثل
import concator = require('concator');

أرجو أن تسامحني - أنا الآن أحاول معرفة ما إذا كان يتم دعم دقة الفهرس الآن وماذا عن index.ts أو main.ts في AMD تتطلب الدقة؟
أقوم أيضًا بإجراء اختبار pinging على basarat لمعرفة ما إذا كان / سيتم دعمه بواسطة https://github.com/TypeStrong/atom-typescript لأنه لا يسمح لي الآن بطلب أي index.ts كما هو مذكور أعلاه.

sebilasse ، إذا كنت تستخدم typescript@next اليوم ، يجب أن يعمل هذا مع --module commonjs

import concator = require('concator'); // resolves to node_modules/concator/index.ts

لا توجد تغييرات على كيفية دقة AMD من الإصدارات السابقة.

DavidSouther يجب أن يكون في typescript@next اليوم. جربها وأخبرنا عن أسعارها.

mhegazybasarat : +1: حسنًا. ولكن ما رأيك في دقة AMD لـ main.ts أو index.ts - ألا يجب أن تكون متسقة في المستقبل؟

sebilasse ، بالنسبة إلى AMD ، أعتقد أننا بحاجة إلى القيام بشيء كما أشار vladima في # 2338 (قسم: RequireJS / ES6 محمل الوحدة).

لطيف جدا!! \ س /

mhegazy ما زلت لا تعمل تمامًا كما أتوقع.

لقد جمعت https://github.com/DavidSouther/typescript-example-using-node مع حالة الاستخدام "المثالية" الخاصة بي. tslib هي مكتبة بسيطة تصدر دالة واحدة. يعتمد tsclient على tslib ، بالإضافة إلى readline من حزم Node. يعد البرنامج النصي للإعداد ملائمًا للتثبيت والربط والتنفيذ. لقد قمت بتضمين عملية تشغيل ، وقمت بتعليق الأجزاء غير المتوقعة مع التعليقات المضمنة.

% ./setup
...
> [email protected] build ~/ts-node/tslib
> tsc --version ; tsc -p src/

message TS6029: Version 1.7.0-dev.20150831
...
> [email protected] build /Users/southerd/devel/tmp/ts-node/tsclient
> tsc --version ; tsc -p src/

message TS6029: Version 1.7.0-dev.20150831
# Expect this to find tslib, but fail type checking.
# See tsclient/app.ts for details
src/app.ts(4,21): error TS2307: Cannot find module 'tslib'.

+ node ./dist/app.js # This works as expected!
What would you ask? What is the meaning of life?
42
+ set +x

لا أحصل أيضًا على دعم اللغة لواردات tslib في tsclient (VSCode الإصدار 0.7.0 (0.7.0)) ، على الرغم من أنني لست متأكدًا تمامًا من TSC الذي يستخدمه ، أو كيفية تغيير ذلك.

DavidSouther برنامج التحويل البرمجي TypeScript تحقق من حقل "الكتابة" في package.json للعثور على ملفات ".d.ts". من خلال هذا التغيير ، أحصل على src/app.ts(13,7): error TS2322: Type 'string' is not assignable to type 'number'. ويبدو أنه خطأ مشروع

آه ، لابد أنني فاتني هذا الجزء من المستندات. ما زلت أواجه المشكلة الثانية - كيف يمكنني تغيير إصدار VSCode tsc؟

يمكنك توفير موقع TypeScript SDK مخصص لـ VSCode عبر إعداد "typescript.tsdk" - يجب أن يشير إلى المجلد الذي يحتوي على ملفات tsserver.js وملفات '.d.ts' القياسية. في حالة تثبيت TypeScript كحزمة npm ، فسيكون شيء مثل

// Place your settings in this file to overwrite the default settings
{   
    "typescript.tsdk": "C:\\Sources\\bugs\\node\\typescript-example-using-node\\tslib\\node_modules\\typescript\\lib"       
}

هل حصل أي شخص على عينة تعمل؟ حاولت طوال فترة الظهيرة أن ألعب بهذا ، لكنني دائمًا ما انتهيت من اللعب

error TS2307: Cannot find module

في الوقت الحالي ، يكون الرمز في node_modules / my-module /. وقمت بتحديد index.ts الذي يهتم بتصدير كل شيء ، وقمت بالإشارة إليه في package.json تحت typecript.main. في مشروع المستهلك حاولت استيراد {AClass} من "my-module" ؛ واستيراد وحدتي = تتطلب ('my-module') ؛ كلاهما يؤدي إلى نفس الخطأ في الكتابة المطبوعة 1.7.0-dev.20150901.

عند حل وحدة ذات اسم غير نسبي ، باستخدام --module commonjs ، سيبحث المترجم عن .d.ts الذي يتطابق مع الاسم الموجود في node_modules\name\index.d.ts أو يبحث في package.json لخاصية typings ، وقم بتحميل ملف d.ts الذي يشير إليه.

من الوصف الخاص بك ، يبدو أنك تقوم بتعيينه على index.ts ، فأنت لا تريد حقًا تجميع تبعياتك ، فأنت تريد فقط أن تستهلك كتاباتها ، لذلك يجب عليك تعيينها على index.d.ts بدلاً من ذلك.

لقد قمت بتحديث الخطوات في خوارزمية دقة وحدة العقدة لتعكس التنفيذ: https://github.com/Microsoft/TypeScript/issues/2338

DavidSouther لدي نفس المشكلة على ما يبدو. عندما أقوم بالتجميع باستخدام تبعية في node_modules ، لا يمكنني حل الوحدة وإخراج خطأ ، ولكن بعد ذلك ، لا يزال يولد js ، وإذا قمت بتشغيله ، فإنه يعمل. ربما يكون ذلك بسبب الإعداد الخاص بي لا أعرف. غالبًا ما تكون d.ts الخاصة بي فارغة ، ولدي index.ts يهتم باستيراد وإعادة تصدير جميع فئات الوحدات النمطية الخاصة بي المحددة في العديد من ملفات .ts. ثم يشير ملف d.ts الخاص بي فقط إلى هذا index.ts ويصدر كل شيء من index.ts مثل هذا:

/// <reference path="index.ts" />

declare module 'my_module' {
    export * from 'index';
}

أيضًا ، لا يزال يقوم بطريقة ما بتجميع ts من node_modules ، لذلك يجب أن أضيف مهمة نظيفة لحذفها بعد التجميع. هل يوجد وصف للميزة في مكان ما يلخص العملية؟

تحرير: لقد نجحت في العمل ، لكنها فائقة الاختراق ولا تزال تنتج أخطاء. لقد أنشأت d.ts باستخدام dts-generator ، ثم قمت باستيراد فصولي مثل هذا:

import MyClass from '../../node_modules/my_module/dist/MyClass';

إذا استخدمت استيراد MyClass من "my_module / MyClass" يمكنني تجميعه بدون أخطاء ، ولكن في وقت التشغيل لا يمكنني العثور على الوحدة النمطية "my_module / MyClass". باستخدام الحل أعلاه ، فإنه يشير مباشرة إلى.

لا تزال تواجه مشكلات في الاستيراد من الوحدات الفرعية (على سبيل المثال npm install angular2، import { Inject, Binding } from 'angular2/di' . ستعمل على الحصول على حالة اختبار محتواة الليلة.

لا تعتقد أن الزاوية تقوم بالفعل بتجميع كتاباتها بالطريقة التي يتوقعها مترجم TypeScript.

من المحتمل أن يكون هذا صحيحًا ؛ سأعمل معهم وأرى أين سينتهي الأمر.

تعمل هذه الميزة بشكل جيد على typecript 1.1 ، على سبيل المثال https://github.com/Nemo157/typescript_w_node_modules_example

ولكن تفشل في الكتابة المطبوعة 1.5.3 ، هل تغير أي شيء؟

------ تحديث ---------

أعلم أنه سيصدر في 1.6 ، شكرًا

يمكنني الحصول على "نصف العمل" فقط في 1.6.2

أولاً ، أقوم بتجميع مكتبة بها my-lib.d.ts في الدليل dist ، وأشير إلى هذا الملف في السمة package.json file typings (على سبيل المثال ، "typings" : "dist/my-lib.d.ts" )

ثم أقوم باستيراد هذه المكتبة في ملف Test.ts TypeScript باستخدام

import { MyObject } from "my-lib"

يتم استيراد MyObject بشكل صحيح ويتم إرسال كود js عند التحويل.
يوفر Visual Studio Code إكمالًا على MyObject

ومع ذلك ، أحصل على تحذيرات من المجمع بما يلي:
Test.ts(10,60): error TS2306: File '[]/node_modules/my-lib/dist/my-lib.d.ts' is not a module.

سيُظهر Visual Studio Code بالفعل الاستيراد كخطأ فادح

يجب أن تكون أية وحدات نمطية مستوردة من حزمة العقدة "وحدات خارجية" وليست "إعلانات وحدة نمطية محيطة". على سبيل المثال ، لا توجد إعلانات declare module "foo" {.. } ، ولكن بدلاً من ذلك ، إعلانات استيراد أو تصدير من المستوى الأعلى في الملف.

لذلك إذا كانت الحزمة الخاصة بك "my-lib" مكتوبة بخط مطبوع ، فقط قم ببنائها باستخدام --declarations واضبط الكتابة على الملف .d.ts للوحدة النمطية الرئيسية الخاصة بك. إذا لم يكن الأمر كذلك ، وكانت كتاباتك عبارة عن شيء كتبته يدويًا ، أو حصلت عليه من كتابته بالتأكيد ، فستحتاج إما إلى تغييره إلى وحدة خارجية ، أو الانتظار حتى يتم حل # 4665 (نأمل قريبًا).

سبب هذا التقييد هو أن هذا يمكن أن يتسبب في تلوث النطاق العالمي والصراعات لاحقًا لمستخدمي الحزمة الخاصة بك. هناك نقاش طويل حول هذا في # 4665.

فيما يلي بعض الوثائق لعمليات البحث المستقبلية: https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages

mhegazy شكرًا لك على ردك السريع الذي ساعدني حقًا في سعيي لأتمتة بناء مكتبة Commonjs librairies ، المكتوبة في Typescript ، والتي يمكن استهلاكها بواسطة كل من Javascript و TypeScript code.
يتحرك بناء الجملة والدقة في import/export بسرعة كبيرة في الآونة الأخيرة لدرجة أن ما أعتقد أنه مفقود الآن هو دليل نهائي حول كيفية إنشاء واحد.

لقد نجحت في العمل ... مع تحذير واحد (ومن ثم سؤال آخر)

هنا عرض مبسط للإعداد.

تتكون المكتبة من ثلاثة كائنات A1 ​​و A2 و B في ملفين من الحروف المطبوعة A.ts و B.ts ؛ شيء مثل

مصادر

A.ts

class A1{}
class A2{}
export { A1, A2 }

B.ts

class B{}
export { B }

ما نريد كشفه يتم جمعه في index.ts :

export * from './A'
export * from './B'

يبني
تم إجراء الإصدار بمساعدة grunt وتم تعيين علامتي --module commonjs و --declaration على tsc 1.6.2
النتيجة النهائية للبناء هي شجرة تشبه

    package.json
    dist/
        js/
             A.js
             B.js
             index.js
        typings/
             A.d.ts
             B.d.ts
             index.d.ts

يحتوي package.json على هذين الإدخالين:

"main": "dist/js/index.js",
"typings": "dist/typings/index.d.ts"

استخدام هذه المكتبة في TypeScript 1.6.2 مع import {A1, A2, B} from "mylib" بسيط يعمل بشكل جيد تمامًا. تعمل التبعيات متعددة المستويات (على سبيل المثال ، librairies التي تستورد بعضها البعض) بشكل جيد أيضًا.

حيث تنشأ المشاكل عندما تعتمد المكتبة على مكتبة أخرى ليست مكتبة TypeScript.
لنفترض أن المكتبة تعتمد على Node.js.
في أحد الملفات المصدر ، سيكون هناك إشارة إلى أنواع NodeJS على سبيل المثال
///<reference path="../typings/node/node.d.ts"/>

عند الترجمة ، سينتهي الأمر بتعليمات <reference > في ملف الإقرار المقابل ؛ المشكلة هي أن المسار إلى node.d.ts من المحتمل أن يكون خاطئًا أو غير موجود.
هل هناك طريقة موصى بها للقيام بذلك؟

_Note_: تم تخفيف هذه المشكلة عن طريق استخدام ملف index.ts لفضح الأجزاء المثيرة للاهتمام من المكتبة ، نظرًا لأن index.ts ليس لديه سبب لاحتواء تعليمات <reference > ومع 1.6 .2 ، لا يبدو أن المترجم يهتم بأن Adts لديه مسار غير صالح في التعليمات المرجعية

bgrieder نتعامل مع هذا في الفوسفور باستخدام tsconfig.json :
https://github.com/phosphorjs/phosphor-widget/blob/master/src/tsconfig.json

نحن ببساطة نضيف أي كتابة خارجية نحتاجها إلى الملفات المجمعة. هذا يعني أنه إذا كان أي من هذه الأنواع الخارجية جزءًا من واجهتنا العامة ، فسيحتاج مستهلكو الكود أيضًا إلى توفير تلك الأنواع الخارجية كجزء من بنائهم. _هذا جيد_. إذا قمنا بتجميع تلك التعريفات ، وبعض الليبونات الأخرى المستخدمة من قبل المستهلك _ أيضًا_ جمعت هذه التعريفات نفسها ، فستكون هناك تعارضات رموز مكررة.

sccolbert نعم!
كنت قلقًا من أن إزالة تعليمات <reference ...> ستؤدي إلى تعطيل الإكمال التلقائي لجميع IDEs ، ولكن مهلا ، لا: على الأقل يبدو أن Visual Studio Code 0.8.0 ذكي بما يكفي لاختيار هذه التعريفات من tsconfig.json ملف

تمت مع reference . ممتاز !

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

ماذا لو كنت تستخدم مشروعًا عاديًا Node.js بداخله و * .d.ts له ، كيف يساعدك الحل tsconfig ؟

heycalmdown ، ما عليك سوى إضافة d.ts إلى الحقل files في tsconfig ، إليك مثال على ذلك:

https://github.com/phosphorjs/phosphor-widget/blob/master/test/src/tsconfig.json#L11
https://github.com/phosphorjs/phosphor-widget/blob/master/test/src/index.ts#L10

لاحظ أنه يتعين علينا استخدام require هنا بدلاً من import فقط بسبب كيفية كتابة ملف d.ts لـ يتوقع.js داخليًا.

حسنا حصلت عليه. تبدو مستودعاتك كنوع من الأمثلة الجيدة.

هل تم تنفيذ هذا بالفعل في TypeScript 1.6.2؟

إذا كان الأمر كذلك ، فهل يمكن لأي شخص أن يقول لي ما الخطأ الذي أفعله هنا ؟:
https://github.com/chanon/typescript_module_example

ربما تريد صيغة الاستيراد es6.

في الأربعاء ، 4 نوفمبر 2015 ، 6:10 صباحًا كتب chanon [email protected] :

هل تم تنفيذ هذا بالفعل في TypeScript 1.6.2؟

إذا كان الأمر كذلك ، فهل يمكن لأي شخص أن يقول لي ما الخطأ الذي أفعله هنا ؟:
https://github.com/chanon/typescript_module_example

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/Microsoft/TypeScript/issues/247#issuecomment -153688004
.

لقد قمت للتو بتحديثه لاستخدام بناء جملة الاستيراد es6 وما زلت أحصل على نفس الأخطاء (لا يمكنني العثور على الوحدة النمطية).

chanon على حزم package.json لـ node_modules تحتاج إلى مفتاح typings الذي يشير إلى ملف d.ts ، _not_ a typescript يشير المفتاح ملفات .ts مثل الموجودة لديك الآن.

نحن نستخدم دقة وحدات العقدة في PhosphorJS حصريًا (في TS 1.6.2) وهي تعمل بشكل جيد. هذا مثال: https://github.com/phosphorjs/phosphor-widget/blob/f908341cb1d46ada8ad8149e695a75e7ea2fde57/package.json#L6

شكرًا لك sccolbert ، ولكن اقتراحي الأولي (في الجزء العلوي من هذه المشكلة) كان السماح لخاصية typescript.main في package.json والتي من شأنها أن تشير إلى نقطة إدخال TypeScript الرئيسية لحزم وحدة العقدة المكتوبة في TypeScript.

سيسمح هذا باستيراد وحدات TypeScript النمطية في كود TypeScript دون الحاجة إلى ملفات كتابة d.ts (لن تكون هناك حاجة لإنشاءها).

chanon كنت أشير للتو إلى ما عليك القيام به لتشغيل الكود الخاص بك.

sccolbert أرى شكرا.

هل يمكن لشخص يعرف أن يخبرني ما إذا كان يجب علي إنشاء مشكلة أخرى تطلب هذه الميزة المحددة؟

يبدو أن المشكلات الرئيسية المتعلقة بمنطق حل الوحدة النمطية (بخلاف هذا) هي # 2338 وهي مغلقة و # 5039 والتي يبدو أنها تتعلق بدعم دقة مسار نمط SystemJS الذي يبدو معقدًا للغاية.

ولكن يبدو أن مجرد استيراد أسلوب CommonJS البسيط كما هو مطلوب في البداية في هذه المشكلة قد تم نسيانه؟ على الأقل الجزء المتعلق بـ typecript.main والمجلدات كوحدات نمطية؟

لا أفهم الحاجة إلى وجود (والرغبة في الحصول على) ملفات d.ts إذا تمت كتابة كل من الوحدة النمطية ومستهلك الوحدة النمطية بالفعل في TypeScript.

إنه في الواقع لا يختلف كثيرًا عن استيراد ملف TypeScript سابقًا نسبيًا .

بدلاً من الاضطرار إلى القيام بما يلي:
import * as lib from '../relative/path/to/typescriptFile.ts'

أو:
import * as lib from '../../node_modules/myModule/index.ts'

ما عليك سوى السماح لـ TSC بالقدرة على العثور على ملف الكتابة المطبوعة للاستيراد باستخدام دقة مسار node_modules العادي. واسمح على الأقل باستيراد المجلدات كوحدات نمطية (مع index.ts) بحيث يمكنني في المثال الثاني القيام بما يلي:

import * as lib from 'myModule'

أم أنه بسبب "أنك لا تريد حقًا تجميع تبعياتك ، فأنت تريد فقط أن تستهلك كتاباتها"؟

chanon السلوك الذي تحدده هو ما هو رئيسي الآن. هل يمكنك إعطاء typescript@next في محاولة؟

أضاف التنفيذ الأصلي للرقم 2338 بعض عمليات التحقق الإضافية للتأكد من أنه ملف .d.ts ، وهذا أساسًا للسبب الذي ذكرته. لا تريد أن يقوم مستخدمو الحزمة الخاصة بك بتجميع "المصادر" الخاصة بك في كل استدعاء للمترجم ، والحصول على مخرجات مختلفة بناءً على خيارات المترجم الخاصة بهم ، فأنت تريد فقط مشاركة ما كتبته.

ومع ذلك ، إذا كنت تقوم ببناء كلتا الحزمتين ، فقد ترغب في القيام بذلك أثناء التكرار عليهما. تمت إزالة التقييد في # 5278.

يرجى إلقاء نظرة على صفحة wiki لمشاركة الكتابة من خلال حزمة npm لمزيد من المعلومات: https://github.com/Microsoft/TypeScript/wiki/Typings-for-npm-packages

شكرا لك على التوضيحmhegazy! سأحاول ذلك.

mhegazy حاولت للتو باستخدام typescript@next ، يعمل كما هو متوقع!

هذا عظيم!!

وشكرًا لكم جميعًا على المشاركة في هذا والقضايا ذات الصلة: +1:

لقد أضفت تحديثًا لنص المشكلة أعلاه لشرح الطريقة التي تم بها تنفيذ هذه الميزة بالفعل.

في ظل خطر الدخول في حقل ألغام ، كيف يُتوقع أن يعمل هذا مع وحدات npm القديمة البسيطة التي لا تحتوي على خاصية typings في package.json؟ محاولة استخدام إما tape أو get-parameter-names مع typescript@next تتسبب في انفجارها في وجهي لأنها غير قادرة على العثور على هذه الحزم بسبب حقيقة أنها لا تملك ذلك منشأه.

بالتأكيد ، إنها ليست وحدات مطبوعة ، لكن لا يمكنني العثور على حل بديل يؤدي إلى تأمين جزء كبير من النظام البيئي npm.

@ danpantry عادة ما تستخدم ملف d.ts عادي مكتوبًا خصيصًا لتلك الوحدة. يحتوي مشروع DefinitelyTyped على ملفات .d.ts للعديد من الوحدات النمطية الشائعة. هناك أداة tsd يمكن أن تساعد في تثبيت وإدارة ملفات .d.ts من موقع DefinitelyTyped لك.

يمكنك استخدام الوحدات النمطية العادية دون الحاجة إلى الكتابة بمجرد استخدام القواعد الشائعة العادية التي تتطلب بناء الجملة.

على سبيل المثال
var moduleName = تتطلب ("moduleName")

يبدو أنchanon هو نوع من الاختراق لاستخدام بناء الجملة "الكلاسيكي" require عند استخدام بناء جملة ES6 مع TypeScript حتى أتمكن من استخدام تبعيات JavaScript ، ولكن شكرًا لك. لقد سمعت عن الأداة المساعدة tsd ولكني لست متأكدًا من كيفية تأثير ذلك في استخدام واردات ES6 .. إلا إذا كنت مضطرًا لبدء استخدام /// <reference path=... لهذه الأنواع من الوحدات؟

نعم هذه طريقة واحدة. هناك طريقة أخرى تتمثل في ملفات tsconfig.json ووضع ملف الجذر tsd.d.ts كملف أول.

قد تكون مهتمًا أيضًا بقراءة هذا ، وتغطية tsd والكتابة https://angularclass.com/the-state-of-typescript-packages/

joewood شكرًا على المعلومات ، المرة الأخيرة التي بحثت فيها في الكتابة المطبوعة كانت في أيام الملفات الفردية .d.ts . مقال ممتاز

chanon @ danpantry من المؤسف أن import foo = require('foo') (مع foo تحت node_modules) لا يعمل عندما لا يكون لدى package.json طباعة.

wmono حسنًا ، نظرًا لأنه ربما كان TypeScript 0.80 أو ربما قبله import foo = require('foo') لبناء الجملة فقط لاستيراد الوحدات النمطية ذات الكتابة. إذا لم يكن به كتابات ، فستستخدم var foo = require('foo') بدلاً من ذلك. لذلك أود أن أقول إنها كما هي.

chanon عفواً ؛ خطأ المستخدم. يبدو أن webpack كان يكافح مع require لكن المشكلة تكمن في مكان آخر.

آسف يمكن لشخص ما توضيح السبب
var foo = require('foo');
يعمل مع node_module قياسي بدون كتابة ولكن
import foo from 'foo';
لا؟ هل كان هذا مجرد تعريف تعسفي؟ لا أفهم لماذا لا يجب أن يعمل هذا الأخير - لا يهمني ما إذا كانت مكتبة JS الخارجية تحتوي على كتابات أم لا.

آسف يمكن لشخص ما توضيح السبب
var foo = يتطلب ('foo') ؛
يعمل مع node_module قياسي بدون كتابة ولكن
استيراد foo من "foo" ؛
لا؟ هل كان هذا مجرد تعريف تعسفي؟ لا أفهم سبب عدم عمل هذا الأخير - لا يهمني ما إذا كانت مكتبة JS الخارجية بها كتابات أم لا.

harangue لأن var require كان أحد تراكيب الوحدات المنافسة (هذه الصيغة commonjs والبعض الآخر في القائمة تتضمن amd ) التي تم دعمها _ خارج نظام فحص النوع_. إذا أراد المرء استخدام نظام النوع ، فربما يفعله import require . مع أخذ ES6 لـ: hammer: والقول أن بناء جملة واحد (: ring :) لحكمهم جميعًا ... من المنطقي أن يكون بناء جملة الوحدة هذا مدعومًا بنظام فحص النوع خارج الصندوق: rose:

basarat شكرا على التوضيح. كانت الرموز مفيدة أيضًا. ؛) ما زلت غير متأكد من سبب فحص نوع القواعد اللغوية ES6. ما الذي يمنع المترجم من أن يقول - "أوه ، لم أتمكن من العثور على أي نوع من البيانات لتلك الوحدة لكنني سأستوردها على أي حال". ما الآثار الجانبية التي قد تترتب على هذا السلوك (الحدسي إلى حد ما ، IMO)؟

هذا محير لأولئك (مثلي) القادمين من ES6 إلى TypeScript. أتوقع أن يتصرف بناء جملة استيراد الوحدة النمطية ES6 بنفس الطريقة في TypeScript ، ولكن للأسف لا يعمل على الإطلاق مع معظم حزم npm ...

لكن للأسف لا يعمل على الإطلاق مع معظم حزم npm ...

تضمين التغريدة هل يمكنك إعطاء مثال ملموس لما تحاول تحقيقه وما الرمز الذي حاولت تحقيقه. هذا فقط حتى أتمكن من مساعدتك: روز:

import koa from 'koa';

يعطي Cannot find module 'koa'. (2307) عندما يكون target es6

koa هو (بالطبع) في node_modules

ومع ذلك ، لا تنشر koa طباعات مطبوعة مع مشروعها. هذا فقط للحزم التي تنشر ملف .d.ts مع مشروعها ، وقم بإدراجها في package.json الخاصة بها. نظرًا لأن koa لا تفعل ذلك ، فستحتاج إلى تثبيت تعريفات الأنواع هذه بالإضافة إلى ذلك من Defin definitely Typed.

يبدو هذا قرارًا سيئًا حيث يتوقع المرء أن يعمل بيان import كما هو الحال في وحدات ES6 العادية. (نعم أعلم ، أن معظم حزم npm هي وحدات CommonJS لكن دعمها هنا سيظل هو الشيء المعقول الذي يجب القيام به.)

أنا جديد على TypeScript لذا ربما لدي فهم خاطئ ، لكن أليست تعريفات النوع اختيارية؟ لماذا لا يمكنني استيراد الحزمة بدون تعريف النوع؟ لا أريد أن أجبر على البحث عن / إنشاء تعريفات النوع.

لا يعد التبديل إلى صيغة استيراد وحدة TS القديمة خيارًا لأنه غير مسموح به عند استخدام الهدف es6 .

أنا جديد على TypeScript لذا ربما لدي فهم خاطئ ، لكن أليست تعريفات النوع اختيارية؟

هذا غير صحيح. يمكن أن تكون تعريفات النوع _في الكود الخاص بك_ ضمنية ، مما يعني أن المترجم الإنشائي سوف "يكتشفها". لن تقوم أبدًا بتمرير مكتبة تابعة لجهة خارجية من خلال برنامج التحويل البرمجي Typescript ، لذلك لا يعرف المترجم أبدًا ما هي هذه الأنواع. إذا كنت تخطط لاستخدام رمز تابع لجهة خارجية ، فيجب أن تتعلم حقًا كيفية استخدام أداة Definitely Typed وأداة tsd .

ماذا عن جوابbasarat؟

http://stackoverflow.com/a/27434010/1529493

لماذا لا يمكن استيراد الوحدات النمطية التي ليست من نوع TypeScript بدون تعريفات النوع على هذا النحو؟

يمكنهم: const koa = require(‘koa’)

في 21 كانون الثاني (يناير) 2016 ، الساعة 14:47 ، كتب Teoh Han Hui [email protected] :

لماذا لا يمكن استيراد الوحدات التي لا تحتوي على تعريفات النوع على هذا النحو؟

-
قم بالرد على هذه الرسالة الإلكترونية مباشرةً أو اعرضها على GitHub https://github.com/Microsoft/TypeScript/issues/247#issuecomment -173574234.

bgrieder أشير إلى صيغة الاستيراد ES6.

(أي أنك تستخدم Commonjs) ، إذا لم يكن الأمر كذلك ، فاستخدم إجابة البصارات declare var

في 21 كانون الثاني (يناير) 2016 ، الساعة 14:48 ، برونو جريدر برونو. كتب [email protected] :

يمكنهم: const koa = require(‘koa’)

في 21 كانون الثاني (يناير) 2016 ، الساعة 14:47 ، كتب تيو هان هوي < [email protected] [email protected] >:

لماذا لا يمكن استيراد الوحدات التي لا تحتوي على تعريفات النوع على هذا النحو؟

-
قم بالرد على هذه الرسالة الإلكترونية مباشرةً أو اعرضها على GitHub https://github.com/Microsoft/TypeScript/issues/247#issuecomment -173574234.

أعتقد أن النقطة التي يتم توضيحها هي أن أحد أهداف TypeScript هو أن JS الصالحة يجب أن تكون TS صالحة. بالنسبة إلى بناء جملة الوحدة النمطية ES6 ، يجب أن يجمع TS هذا مع وجود إعلانات النوع أو بدونه. بدون إقرارات النوع ، يجب أن يتم حل بيان import فقط إلى any .

وأنا أتفق تماما مع ذلك.

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

في 21 كانون الثاني (يناير) 2016 ، الساعة 14:52 ، كتب Joe Wood [email protected] :

أعتقد أن النقطة التي يتم توضيحها هي أن أحد أهداف TypeScript هو أن JS الصالحة يجب أن تكون TS صالحة. بالنسبة إلى بناء جملة الوحدة النمطية ES6 ، يجب أن يجمع TS هذا مع وجود إعلانات النوع أو بدونه. بدون إقرارات النوع ، يجب أن يتم حل بيان الاستيراد فقط لأي منها.

وأنا أتفق تماما مع ذلك.

-
قم بالرد على هذه الرسالة الإلكترونية مباشرة أو اعرضها على GitHub https://github.com/Microsoft/TypeScript/issues/247#issuecomment -173575301.

FWIW هذا السلوك (توقع كتابة جميع مكتبات الطرف الثالث مسبقًا) هو ما يجعلني أستخدم Flow over TypeScript. على الرغم من أن TypeScript يدعم IDE ، فإن توقع كتابة كل شيء في وقت مبكر ليس بالأمر المعقول حقًا ، خاصةً عندما يكون هناك الكثير من المكتبات التي:

  • ليست على DefinitelyTyped
  • ليس لديك مجلد ./typings
  • ليس لدي الوقت لأكتبها بنفسي

أفضل ألا أضطر إلى محاربة شيء من المفترض أن يساعد في تطوري.

@ danpantry ، لماذا لا تعلن فقط عن نقطة دخول lib الخاصة بك كأي نقطة ، وسيكون المترجم راضيًا عن ذلك:

declare var $: any;

هذا حل بديل. لكنني أعتقد أنه سيكون فكرة جيدة أن تحترم TypeScript كود الوحدة النمطية ES6 والرجوع إليها بأمان. لا يمكنني رؤية سبب وجيه لعدم إمكانية رجوع بيان الاستيراد إلى any بدلاً من الإبلاغ عن خطأ إذا كانت وحدة المستوى الأعلى غير مطبوعة.

أفضل أن يفشل المترجم مبكرًا وبصوت عالٍ (السلوك الحالي) ، بدلاً من السماح لقضايا وقت التشغيل بالتسلل دون أن يلاحظها أحد. أفضل استخدام سطر declare var foo: any للإشارة إلى "هذا غير آمن ، وأنا أعلم ما أفعله".

لماذا لا نسمح فقط ببنية استيراد ES6 عندما لا تكون هناك أي كتابات متاحة ، مشكلة تحذير مترجم بسيط من أن الاستيراد قد تم حله إلى any ، بدلاً من خطأ "منع الانبعاث"؟

في 21 كانون الثاني (يناير) 2016 ، الساعة 18:42 ، كتب S. Chris Colbert [email protected] :

أفضل أن يفشل المترجم مبكرًا وبصوت عالٍ (السلوك الحالي) ، بدلاً من السماح لقضايا وقت التشغيل بالتسلل دون أن يلاحظها أحد. أفضل أن يكون لدي تصريح var foo صريحًا: أي سطر للإشارة إلى "هذا غير آمن ، وأنا أعلم ما أفعله".

-
قم بالرد على هذه الرسالة الإلكترونية مباشرةً أو اعرضها على GitHub https://github.com/Microsoft/TypeScript/issues/247#issuecomment -173649845.

على أي حال ، يدعي المترجم حاليًا أنه لا يمكنه العثور على الوحدة ، في حين أنه في الواقع يرفض استيراد الوحدة بدون تعريف النوع. هذا ليس مفيدًا حقًا ، أليس كذلك؟

^ ^ ^ هذا ألف مرة. لم يكن هناك ما يشير إلى أنني كنت أفعل شيئًا خاطئًا عندما واجهت هذه المشكلة لأول مرة. استغرق الأمر بعض الوقت الشاق من البحث على Google لمعرفة ما حدث أخيرًا (بالمناسبة ، أعتقد أن هذه المشكلة هي واحدة من الأماكن الوحيدة التي يمكن العثور عليها والتي توثقها). إنه غير ضروري للغاية. ومع Angular 2 الذي أدخل TypeScript بشكل أكبر في الاتجاه السائد ، يمكنني فقط أن أتخيل عدد أسئلة Stack Overflow التي ستأتي من هذا السلوك.

أتفق كثيرًا مع وصف معالجة الخطأ الضعيف واجعله يستورد كأي شيء!

sccolbert أوافق على أنه يجب أن يكون هناك إشعار لكنني لست متأكدًا من أنه يجب أن يكون فاشلاً - تحذير بدلاً من ذلك ، perhap

أتفق مع mhegazy وsccolbert.

أنا أفضل نصوص بناء الإنتاج لدينا (أي خادم CI) للشكوى بصوت عالٍ إذا كان هناك شيء خاطئ.

أهلا يا أصدقاء،
هذا السلوك يدفعني للجنون. ملفات التعريفات غير محدثة أو غير مسجلة في package.json .
في النهاية ، ينتج $ TypeScript JavaScript ، لذا ، حتى نذهب جميعًا إلى هذه اللغة ، يرجى أن تكون لطيفًا مع بقية العالم الذي يوفر مكتبات للغة الأم في أي لغات أخرى مترجمة ، مثل لغتك .
أريد حقًا أن أعرف ما إذا كان TypeScript يريد البقاء (أود أن أقول "للتكامل" كما يبدو غير موجود ، حتى الآن) في النظام البيئي JavaScript أو يريد أن يعيش حياة منفصلة ، مثل الخيار الثاني سيجعلني أذهب إلى شيء آخر.
لتحقيق أن التبديل في الملف .tsconfig سيفي بالغرض ، لذلك يمكننا القول إننا نريد عمليات استيراد صارمة أم لا.
بالنسبة لشكوى CI الصاخبة ، هناك أطر اختبار لذلك في JavaScript . على أي حال ، لن تحصل على فحص الكتابة في وقت التشغيل ، فإن تدقيق الاستيراد السيئ هو المشكلة الأقل أهمية.
أتمنى لك كل خير.

@ devel-pa ، يُقصد من الأخطاء إخبارك أن المترجم ليس لديه فكرة عن ماهية الاستيراد. لا يمكن التحقق من أي استخدام لاحق للاستيراد.

لا يؤدي إيقاف تشغيل الأخطاء إلى حل أية مشكلات. إنه يدفع هذه "المجهول" بصمت عبر نظامك. بدون معلومات النوع ، لا يستطيع المترجم أن يحذرك بشأن ما هو آمن وما هو غير آمن. وهذا هو بيت القصيد من TypeScript :)

أما بالنسبة للمولدة JS. لا يؤدي أي من أخطاء نوع TS إلى إيقاف إنشاء الإخراج. إذا كنت لا تهتم بأخطاء النوع ، فما عليك سوى تجاهلها جميعًا. لا يزال المترجم ينشئ ملفات .js المطابقة.

حل التعاريف المفقودة هو التصريح عنها. لا يتعين عليك الإعلان عن الشكل الكامل للوحدة ، ولكن يجب عليك فقط الاسم. هذا يسمح للمترجم بمعرفة أن هناك وحدة "myLibrary" ، يمكنه تحذيرك من الأخطاء الإملائية في أسماء الوحدات ، والأهم من ذلك ، لن يتم إلغاء تحديد أي وحدات أخرى.

declare module "myLibrary" {
    var a: any;
    export = a;
}

كما هو موضح في # 6615 ، يجب أن يدعم TypeScript شكلاً أقصر من هذا قريبًا.

أعتقد أن المشكلة تكمن في الألم الذي يسببه هذا الإعداد للمشاريع. أعتقد أن هذه المشكلة مماثلة لأي مشكلة ضمنية . في الوقت الحالي ، تعتبر هذه الواردات باطلة ضمنيًا . بالتأكيد ، يمكن تجاهل الأخطاء ، لكن هذا يسبب الكثير من الضوضاء ويتعارض مع فلسفة الكتابة التدريجية و JS الصالحة هي TS صالحة.

أستطيع أن أفهم الالتباس هنا للأشخاص الجدد في TS. إذا كانوا قد استخدموا بنية الوحدة النمطية ES6 بنشاط في JS ، فلماذا لا يعمل فقط في TS؟ ما هو مميز حول import from أكثر من var x = require - والذي _ يتم التعامل معه على أنه أي ضمني. في الأصل ، كان الاستيراد كلمة رئيسية محددة لـ TS ، لذلك كان يعني ضمنيًا أن المطور يريد أن يتم التعامل مع الوحدة على أنها وحدة نمطية مكتوبة. الآن بما أنه ليس حصريًا لـ TS ، لا أعتقد أنه يمكن إجراء هذا الافتراض.

ضمني - أي أخطاء في التصريحات المتغيرة دون نوع. لكن استخدام متغير غير معرّف لا يزال يمثل خطأ اليوم. بالنسبة إلى jquery ، ما زلت بحاجة إلى declare var $; في مكان ما لكي يعرف المترجم أنك تقصد حقًا أن يكون لديك متغير عام يسمى $ وليس مجرد كتابته بشكل خاطئ. إنه مشابه إلى حد ما للوحدات النمطية ، يحتاج المترجم إلى معرفة أن هناك وحدة تسمى "myLibrary" وهذا ليس اسمًا مكتوبًا بشكل خاطئ. لذا فقط أضف تصريحًا عنها.

على أي حال ، يجب أن يدعم # 6615 إضافة declare module "*"; لمطابقة جميع الوحدات في نظامك ، على الرغم من أنني أعتقد أنك إذا فعلت ذلك ، فلن تحصل على أي مساعدة من أدواتك ، وأنت تهيئ نفسك لمواجهة مؤلمة الانتقال لاحقًا عندما تقرر إزالته.

mhegazy أنا أفهم أسبابك ولكن لدي مشكلة مع هذا الأساس المنطقي

بشكل أساسي ، أنت تطلب منا تصميم تعريف وحدة "عنصر نائب" ، وستختفي المشكلة.
هذا الخطر هو أنه بعد فترة ، في مشروع بحجم معقول ، قد تتسلل تعريفات "العنصر النائب" هذه وسيتم دفنها في بعض دليل الطباعة. عدم وجود المزيد من التحذيرات ، سينساها الجميع فقط وعندما تظهر مشكلة ، فإن مراجعة كل تعريف وحدة لمعرفة العنصر النائب ، سيكون مجرد ألم.

يزداد الوضع سوءًا مع الوحدات النمطية المكتوبة (تلك التي تحتوي على الإدخال typings في package.json) التي نفترض أنها تمت كتابتها بشكل صحيح يمكن أن تستخدم بالفعل تلك العناصر النائبة داخليًا.

أفهم أنه لا يمكن منع هذه العناصر النائبة ، لكنني أفضل كثيرًا ألا يتم تشجيعهم على الأقل.
ما يجب الدفاع عنه هو أنه افتراضيًا ، يتحول الاستيراد إلى any وأن المترجم يصدر تحذيرًا في كل عملية تجميع. لذلك على الأقل ، بالبحث في سجلات المترجم / CI ، نعلم أن شيئًا ما قد يكون مريبًا ويحتاج إلى تحسين.

(كجانب ليس ، كما هو مذكور في الصفحة الرئيسية linkscriptlang.org ، تعد Typescript عبارة عن "مجموعة شاملة" من Javascript ، ويجب فقط ابتلاع أي صيغة ES6 صالحة لـ IMHO كما هي)

الحلول البديلة وإخفاء القمامة تحت السجادة هي أسوأ ما يمكن أن يحدث (بجانب ES6 super).
أنا أعمل مع JS libs طوال الوقت ، وعادةً مع الإصدارات الأخيرة كجزء من وظيفتي والترميز الإضافي في المنزل. 90٪ لم تتم كتابتهم أو لديهم ملفات تعريف قديمة ، و 9٪ لم تتم كتابتهم جيدًا (حيث لا يعرف المترجم كيفية إنشاء معرف واحد لجميع الملفات). لا يوجد لديّ دلالات جيدة جدًا ، لنفس السبب السابق ولسبب أن هدفي هو JS ، لا أعتقد أنني يجب أن أهتم باللغة الأصلية.
أيضًا ، لقد رأيت سبب وجود شفرات "غير معروفة". لا ، على الإطلاق ، إذا كان المطورون لا يعرفون ويفهمون ماهية libs المستخدمة ، ولماذا يزعجهم ، فأنا أعرف لماذا أستخدم الأشياء ولماذا أضيف إلى المكدس. التحذير والاختبارات (في حال وجودها) كافية لذلك.
الرجاء ، جافا سكريبت أولاً ، هذا هو الهدف والنظام البيئي. TS هو مجرد ملحق لتحسين الترميز والتحقق من الكتابة في وقت الترجمة ، ولكن فقط لما نقوم ببنائه. الباقي ليس من الأعمال المطبوعة.
أريد أن أذكر أنني كنت ضد nmps peerDependencies أيضًا ، أنا من اختار وليس البرنامج. البرمجة الحتمية ، حبيبي.

ماذا عن استيراد الوحدات من دليل JSPM بدلاً من node_modules؟

تحرير: لقد وجدت تذكرة موجودة -> https://github.com/Microsoft/TypeScript/issues/6012

واجهت للتو مشكلة في دقة وحدة Node ، عند استخدام SystemJS لتحميل دليل:

على ما يبدو ، بينما تدرك Node (وبالتالي TypeScript) أن المسار هو في الواقع دليل وبالتالي يتم تحميل index.ts بدلاً من ذلك ، فإن SystemJS لا يفعل شيئًا من هذا القبيل ، مما يعني أن رمز TS الصحيح سيفشل بالفعل في التحميل في المتصفح.

هذا صحيح أيضًا بالنسبة للوحدات النمطية للعقدة التي تحتوي على نقطة إدخال index.ts / js أو حتى تستخدم خاصية package.json main . هذا أسهل في التعامل معه ، لأنه من السهل (على الرغم من التكرار) إضافة تكوين حزمة إلى SystemJS. هذا ليس بالأمر السهل عند العمل مع الدلائل العشوائية.

ما هو الحل المناسب لذلك؟

دقة الوحدة التلقائية لـ JSPM غير مدعومة حاليًا. يتم تتبع ذلك من خلال https://github.com/Microsoft/TypeScript/issues/6012.

التوصية هي استخدام دعم دقة وحدة تعيين المسار ، راجع https://github.com/Microsoft/TypeScript-Handbook/blob/release-2.0/pages/Module٪20Resolution.md#path -mapping

الإرشادات المذكورة أعلاه هي بداية ، ولكن قد يحتاج بعض الأشخاص إلى القيام بشيء إضافي ... قد تضطر إلى إضافة
<Folder Include="node_modules" />
إلى .njsproj

مزيد من المعلومات

كنت أقوم بالبناء باستخدام gulp ، وكان لدي TypeScriptCompileBlocked في .nsproj. لإصلاح المشكلات في تصحيح نقاط التوقف في VS 15 Preview 5 (كنت أتلقى خطأ "الإطار ليس في الوحدة النمطية") والمشكلات التي كنت أواجهها مع intellisense كان علي إضافتها إلى .njsproj. كان هذا الدليل موجودًا بالفعل عندما قمت باستيراد المشروع ، ولكن تم ضبطه على git-ignore. هذه هي نظريتي حول سبب تجاهل Visual Studio لها (ربما يجب أن يكون لها استثناء تلقائي للوحدات node_modules؟)

بالإضافة إلى كل من تصحيح الأخطاء وعمل intellisense ، توقفت أيضًا عن رؤية أخطاء intellisense بما يتجاوز نفس الأخطاء الدقيقة التي رأيتها من gulp أثناء إنشائه ، وهو أمر متوقع.

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