إصدار TypeScript:
الإصدار 2.6.2
مصطلحات البحث:
ملف إعلان لوظيفة تصدير الوحدة ، الوحدة الخارجية ، حزمة npm ، وحدة الطرف الثالث
الشفرة
src/testFile.ts
:
import getFieldList = require('graphql-list-fields');
src/@types/graphql-list-fields/index.d.ts
:
// Doing just this below (as suggested by the Typescript Handbook does not work
// and results in the tsc error under **Actual behavior** below
import { GraphQLResolveInfo } from 'graphql';
declare function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
// The code below is what actually works instead of the above
/*
declare module 'graphql-list-fields' {
import { GraphQLResolveInfo } from 'graphql';
function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
}
*/
سلوك متوقع:
تجميع بدون أخطاء.
السلوك الفعلي:
خطأ عند تشغيل tsc
:
src/testFile.ts(1,31): error TS7016: Could not find a declaration file for module 'graphql-list-fields'. '/node_modules/graphql-list-fields/index.js' implicitly has an 'any' type.
Try `npm install @types/graphql-list-fields` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql-list-fields';`
graphql-list-fields
حزمة NPM التي أحاول استخدامها ، والتي لا تحتوي حاليًا على أي تعريفات نوع منشورة.
بعد قراءة قسم "كتيب Typescript" الخاص بملفات التصريح ، وجدت أنني أحاول كتابة ملف إعلان لمكتبة معيارية ويجب أن أستخدم قالب ملف إعلان module-function.d.ts . هذه هي الطريقة التي توصلت بها إلى الكود الموجود في index.d.ts
أعلاه ، لكن المترجم ما زال يشكو من عدم وجود ملف التصريح الخاص بالوحدة "Graphql-list -field". بعد التجربة والخطأ ، وجدنا أن إضافة declare module 'graphql-list-fields'
حول كل شيء يعمل بدون أخطاء في المترجم.
لقد حاولنا تعيين "typeRoots": ["./node_modules/@types", "./src/@types"]
في tsconfig.json
، كما هو مذكور في مستندات tsconfig ولكن هذا لا يزال لا يعمل بدون declare module 'graphql-list-fields'
. يبدو أن هذه مشكلة لأن tsc لم يعثر على تعريف النوع في الدلائل المحددة في typeRoots.
"typeRoots"
مخصص للرمز العام. أي شيء معلن في مساحة الاسم العالمية ، وتريد إدراجه. هذا هو السبب في أن declare module 'graphql-list-fields' {..
الخاص بك يعمل ، لأنه يعلن فقط عن وحدة بهذا الاسم في مساحة الاسم العالمية.
بالنسبة للوحدات النمطية ، فإن لها نطاقها الخاص ، كل ما تحتاجه هو تعيين المسار ..
شيء مثل:
{
"compilerOptions": {
"target": "es5",
"baseUrl": "./",
"paths": {
"*" : ["src/@t`ypes/*"]
}
}
}`
شكرا لتوضيح ذلكmhegazy. أعتقد أنه سيكون من المفيد لو تم شرح ذلك أكثر في مستندات TypeScript ، ربما ضمن قسم ملفات التصريح .
يعد TypeRoots حقًا دعمًا قمنا بإضافته للتوافق مع
لست متأكدًا مما إذا كان هذا يناسب قسم ملف الإعلان. لدينا ملاحظة حول ذلك في https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping
يمكنني إضافة ملاحظة في قسم ملف الإعلان حول قسم قرار الوحدة ككل.
قم بقراءة هذا القسم وأخبرنا إذا كنت لا تزال تجد المستندات غير موجودة فيه
حسنا أرى ذلك. نعم ، هذه هي الصفحة التي أحتاجها للبدء بها. أعتقد أنه سيكون من الجيد أن يكون لديك على الأقل إشارة مختصرة إلى تعيين المسار وربما رابط إلى هذا المستند في مكان ما تحت https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html.
إغلاق هذه المشكلة تلقائيًا لأغراض التدبير المنزلي. تشير تسميات المشكلات إلى أنه غير قابل للتنفيذ في الوقت الحالي أو تمت معالجته بالفعل.
ما زلت أعتقد أنه سيكون من المفيد تحديث المستندات كما هو مذكور في تعليقي السابق @ typescript-bot
يعد TypeRoots حقًا دعمًا قمنا بإضافته للتوافق مع
mhegazy وجود ميزة مدعومة مع وثائق قليلة إلى معدومة هو ما متحررًا بلغة التحذير الخاصة بك. فمثلا:
_ ملاحظة: يتم توفير هذه الميزة للتوافق مع الإصدارات السابقة مع الكتابة لدعم الترحيل. انظر ملاحظات الإصدار [هنا] لمزيد من المعلومات.
سيكون هذا مفضلًا بشكل كبير على الاضطرار إلى مسح مشكلات GitHub و StackExchange وما إلى ذلك للحصول على معلومات.
Thx a سخيف طن mhegazy ! : tada: كان إدخال المسار هذا لـ @types
أخيرًا القطعة المفقودة التي جعلت إعداد مشروعي غير القياسي يعمل. قضيت أيام في هذا.
إذا كنت لا تمانع في إبطاء عملية بدء التطبيق الخاص بك قليلاً ، يمكنك فقط إضافة TS_NODE_FILES=true
إلى البرنامج النصي الخاص ببدء package.json الخاص بك وسيتم العثور على كل ملف التصريح المخصص.
أحصل الآن على:
The following changes are being made to your tsconfig.json file:
- compilerOptions.paths must not be set (aliased imports are not supported)
ويتم حذف هذا الخيار.
KrzysztofMadejski الذي تم بواسطة CRA ، وليس TS نفسها.
يقول هذا الخيط أن typeroots هو حقًا للتوافق مع الإصدارات السابقة. أحاول استخدامه لتأليف أنواع من أجل كتابتها بشكل نهائي. وإلا فكيف يمكنني اختبار هذه الأنواع بشكل صحيح بدون جذور؟ لقد قمت بإنشاء أنواع باستخدام dts-gen
وأضفت types
إلى جذور النوع الخاص بي وما زلت لا حظ :-(
Roaders هل وجدت الحل لاستخدام الأنواع التي تم إنشاؤها dts-gen
؟
تحرير: محلول باستخدام https://github.com/microsoft/TypeScript/issues/22217#issuecomment -369783776
هناك شيء واحد لا أفهمه هنا وهو:
tsconfig.base.json:
"typeRoots": ["node_modules/@types", "types"],
وهيكل الدليل:
/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts
لن يتم التقاطها على الإطلاق في مستودع nrwl / nx الخاص بي. يمكنني تجربة مليون شيء ولكن إذا قمت بنقل هذا المجلد something-else
إلى node_modules/@types
فسوف يعمل بطريقة سحرية ويتم التقاطه ، مما يشير إلى أن typeRoots
لا يفعل شيئًا على الإطلاق مثل node_modules/@types
تم التعامل مع
وضع علامة على typeRoots على أنها مهملة والقول بأنها تعمل بطريقة غريبة / ملتوية كان من شأنه على الأقل منعني من محاولة استخدامها.
الطريقة الوحيدة التي تمكنت من خلالها من إضافة أنواع محلية في كل مرة أحتاج إليها ، هي قضاء ساعات في القتال مع tsconfig.base.json والتعثر في تعليق mhegazy أعلاه
ظللت أتعرض للعض من هذا ونسيت الاضطرار إلى تكوين خيار paths
أيضًا ، لذلك قمت بإنشاء مستودع بسيط بالإعدادات المناسبة. أتمنى أن يساعد شخص ما.
التعليق الأكثر فائدة
mhegazy وجود ميزة مدعومة مع وثائق قليلة إلى معدومة هو ما متحررًا بلغة التحذير الخاصة بك. فمثلا:
سيكون هذا مفضلًا بشكل كبير على الاضطرار إلى مسح مشكلات GitHub و StackExchange وما إلى ذلك للحصول على معلومات.