Typescript: قم بتمكين الانتقال إلى التنفيذ في محرري الأنواع

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

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

على سبيل المثال ، في البرنامج المساعد Atom Editor atom-typecript ، يمكنك الضغط على F12 من أجل "الانتقال إلى الإعلان" والذي غالبًا ما يصل ، كما هو مطبق حاليًا ، إلى ملف .d.ts الذي يحتوي على توقيع الوظيفة ولكن ليس التنفيذ الفعلي.

نظرًا لأن المحلل اللغوي لـ Typescript غالبًا ما يُنشئ ملفات d.ts من ملفات تنفيذ ts. هل يمكن الاحتفاظ بهذا الارتباط بين ملفات d.ts و. t (ربما يتم إخراجها باستخدام خيار مترجم منسوخ النص) بحيث يمكن لمحرري Typescript نقل المطورين إلى قائمة الفئات أو الوظائف المنفذة؟

فتحت طلبًا مشابهًا لمحرر Atom-typecript ، لكنهم يشيرون إلى أنهم لا يستطيعون تنفيذ ذلك بدون دعم المحلل اللغوي لـ Typescript:
TypeStrong / atom-typecript # 790

API Symbol Navigation Experience Enhancement Suggestion VS Code Tracked

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

DanielRosenwasser هل من تحديثات على هذا؟ - ميزة واحدة مطلوبة بالنسبة لي.

ال 83 كومينتر

هل تريد أن تنتقل هذه الوظيفة إلى .js المقابل إذا كان ذلك متاحًا ، بشرط أن يكون التعريف غير مناسب ، أليس كذلك؟

RyanCavanaughmousetraps @ bowdenk7

إذاً ، تريد أن تنتقل هذه الوظيفة إلى ملف .js المقابل إذا كان متاحًا ، بشرط أن يكون التعريف محاطًا ، أليس كذلك؟
نعم ، هذا سيناريو سيكون مفيدًا جدًا للإنتاجية. هذا وحده سيكون ذا قيمة كبيرة. أعتقد أن مؤلف النص المكتوب على الذرات يعتقد أن المزيد من الخطافات في مترجم تنضيد الحروف ستجعل من السهل عليه تنفيذ ذلك. أنا غير واضح فيما إذا كانت هذه معلومات عن أرقام سطور تنفيذ js هي معلومات يعرفها المترجم المنسوخ عادةً داخليًا.

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

أدرك أن هذا يطلب المزيد للانتقال إلى تنفيذ ملف .ts في المكتبة المطلوبة لأنه قد يحتاج إلى استخدام خريطة المصدر أو توزيع المصدر / الارتباط بمصدر ts الأصلي. يبدو لي أن برنامج التحويل البرمجي الذي يُنشئ المكتبة الأولية للوظائف والفئات سيعرف الخطوط التي يوجد بها التنفيذ ويمكنه الاحتفاظ بأرقام الأسطر عند توزيع المكتبة بطريقة ما بحيث يقوم مترجم النص البرمجي للتطبيق باستخدام الفئة يمكن أن يعرف الخط الذي يجب القفز إليه في المكتبة.

هل هذه المعلومات عن رقم سطر وظيفة / فئة التنفيذ متاحة في خرائط المصدر؟ هل هناك مصادر أخرى لهذه المعلومات؟

نظرًا لأننا سنستخدم علامة --allowJS ، يجب أن تكون خدمة اللغة قادرة على العمل مع ملفات JS.

لا أعرف كيف تعمل ملفات .d.ts وملفات .js معًا حاليًا في هذا الصدد. من المحتمل (بالتأكيد)

إعادة الفتح ، لأن الانتقال إلى ملفات js لم يتم دعمه بعد

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

تم نقل / إغلاق / خداع / إلغاء هذه المشكلة عدة مرات ويمكن أن يؤدي إصلاح هذا الخطأ إلى زيادة إنتاجية هائلة.

https://github.com/ubershmekel/vscode-ts-goto-source لديه مشروع يعيد إظهار المشكلة. كما هو موضح في https://github.com/Microsoft/vscode/issues/26325 والمشار إليه في https://github.com/Microsoft/vscode/issues/10806 و https://github.com/Microsoft/vscode/issues / 18321

ملاحظة اضطررت إلى استخدام "typescript.disableAutomaticTypeAcquisition": true من نقطة واحدة لاستخدام جافا سكريبت "انتقل إلى التعريف" لأنه يبدو أن ملفات .d.ts ستتولى المهمة إذا وجدت.

DanielRosenwasser هل من تحديثات على هذا؟ - ميزة واحدة مطلوبة بالنسبة لي.

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

DanielRosenwasser هل هذا يتقدم؟ أنا حقا أحب هذه الميزة

المشكلة نفسها. تريد "الانتقال إلى التنفيذ" إلى الكود المصدري ، وليس xx.d.ts

نعم ، عدّل ملف التصريح عن طريق الخطأ عدة مرات في اليوم بعد استخدام cmd + click وينتهي بي الأمر بالارتباك عندما لا يعمل الرمز بشكل صحيح. خاصة وأن src و dec تبدو متشابهة جدًا. سيكون رائعًا إذا كانت هناك طريقة ما لاختيار ما إذا كنت أرغب في الانتقال إلى مصدر الإعلان ، أو حتى أفضل إذا كان VSCode سيحدد ذلك لأن الذهاب إلى المصدر هو دائمًا IMHO المفضل (إذا كان متاحًا).

الذهاب إلى المصدر هو الأفضل دائمًا IMHO (إذا كان متاحًا)

عندما يكون المصدر في TS. إذا كان المصدر في JS على الرغم من وجود سبب وجيه للذهاب إلى .d.ts

عندما يكون المصدر في TS. إذا كان المصدر في JS على الرغم من وجود سبب وجيه للذهاب إلى .d.ts

لماذا ا؟ يمكنني فقط التمرير لرؤية تعريف النوع. على أي حال ، يجب أن يكون هناك أمر منفصل لتعريف النوع مقابل التنفيذ.

هل هناك أي سبب لماذا لا يزال هذا معلقًا؟ حل بديل أو شيء من هذا القبيل؟ شكرا لك مقدما

نظرًا لأن المحلل اللغوي لـ Typescript غالبًا ما يُنشئ ملفات d.ts من ملفات تنفيذ ts. هل يمكن الاحتفاظ بهذا الارتباط بين ملفات d.ts و. t (ربما يتم إخراجها باستخدام خيار مترجم منسوخ النص) بحيث يمكن لمحرري Typescript نقل المطورين إلى قائمة الفئات أو الوظائف المنفذة؟

لديّ فرع # 21930 يتيح إنتاج خرائط مصادر لملف التصريح بدقة هذه (وسأطلبها للمراجعة إما عند الطلب أو بمجرد دمج # 21930) ، وأعمل على إضافة دعم إلى LS الخاص بنا لمتابعة هذه الخرائط. نريد شحنه في 2.8.

حسنًا ، لقد كنا نعمل على ذلك. لقد احتاجت فقط إلى الكثير من التغييرات الداخلية. 😄

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

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

@ derN3rd هناك vscode-search-node-modules لتصفح node_modules في لوحة الأوامر (ولدي أيضًا مفترق يفتح دائمًا README vscode-open-node-modules )

أتفهم أن النقر فوق طلب / استيراد وفتح المصدر لملف بعيد عن ux المثالي ، ولكنه بالتأكيد أفضل من التمرير node_modules

@ derN3rd سنقوم بشحن علامة --declaratrionMap في 2.9 (والتي قد يتم إصدارها خلال الشهر المقبل) ، وقد قمنا بالفعل بتمكين الانتقال إلى التعريفات في المصدر الأصلي TS عبر .d.ts المرتبط باستخدام لهم (والتي ، إذا كنت تقوم بشحن ملفات التصريح في مجلد وحدات العقدة الخاصة بك ، فقد تحصل على الكثير مما تريد). نحن نتطلع أيضًا إلى القفز من / إلى JS المرتبط أيضًا ، بشرط أن تكون خرائط المصادر العادية قيد التشغيل أيضًا.

weswigham شكرا على الرد السريع! يبدو جيدا
هل يمكنك نشر تحديث هنا إذا كانت الميزة جاهزة أو جاهزة للاختبار؟

--declarationMap (وما يرتبط به من إعادة توجيه LS) في حفلاتنا الليلية منذ إصدار 2.8 مباشرةً. الشيء الوحيد الذي لم نقم به حتى الآن هو التنقل في ملف JS ، حيث قد يتطلب ذلك بعض التنسيق الإضافي للمحرر.

أي أخبار لذلك على 3.0-rc؟

نفس المشكلة مع ملفات .css و .json . انتقل إلى تعريف يأخذني إلى ملف .d.ts .

import React from 'react'
import Route from 'react-router-dom/Route'
import Switch from 'react-router-dom/Switch'
import Loadable from 'react-loadable'
import  './App.css'
import './tailwind.css'

انتقل إلى التعريف على ./App.css يأخذني إلى

declare module '*.css' {
    const content: any;
    export default content;
}

declare module '*.svg' {
    const content: any;
    export default content;
}

declare module '*.json' {
    const content: any;
    export default content;
}

يأتي VS Code الآن مع TypeScript 3.0.3. أي أخبار بشأن هذه المسألة؟

يعمل بالنسبة لي (تم إنشاء خرائط التصريح باستخدام TS 2.9.2 ، وتشغيل VSCode 1.27.0). التنقل من عميل واجهة برمجة التطبيقات (تم تنفيذه في JS) _الانتقال إلى التعريف_ يأخذني إلى التنفيذ في ملف .ts.

يجب أن يأخذك robsman _Go to Definition_ إلى كود js المترجم ، بينما يجب أن يأخذك _Go to Type Definition_ إلى ملف .d.ts.

كيف يمكنك استخدام / تضمين الوحدة النمطية الخاصة بك ، لفتح الملفات المصدر؟

لا تزال هذه المشكلة موجودة بالنسبة لي في VSCode 1.27.0 ، حيث تأخذني كلتا الوظيفتين إلى ملف .d.ts

تحرير: أعتقد أنني أسأت فهم تعليقك. هل يأخذك إلى الكود الحقيقي؟ إذا كان الأمر كذلك ، فهل تستخدم monorepo أم أن الكود المترجم يتم شحنه في وحدة npm خاصة؟ هل تقوم بشحن ملفات المصدر مع التعليمات البرمجية المجمعة الخاصة بك؟

تم إعادة اختبار

يجلس إعلان API والتنفيذ في وحدة نمطية منفصلة تشير حزمة الاستدعاء إلى تبعية _git + ssh ..._.

robsman أعتقد أن Go to Definition يجب أن يحيلني إلى مصدر فئة "هذه" أو الوظيفة في ملف js المصدر (إذا كان javascript) داخل node_modules وليس .d.ts . مثله يعمل في Sublime Text 3 أعني. على أي حال أنا لا أفهم ما VSCode هذه الميزة في الحالة الحالية

نأمل أن تعطي الأولوية لهذه المشكلة ، إنها حقًا ألم كبير ، من العديد من التعليقات والقضايا ذات الصلة.

الرجاء إضافتي إلى القائمة الطويلة من الأشخاص الذين يحاولون استخدام النقر مع الضغط على الأوامر للتنقل عبر الكود. ليس لديّ TS في مشروعي وحزمة npm التي أتنقل إليها لا تستخدم TS ، ومع ذلك ، فإن النقر على الأمر يتطلب ('co-body') يأخذني إلى تعريف TS الذي تم إنشاؤه داخليًا. أنا مستخدم IntelliJ منذ وقت طويل وما زلت ، ولهذا السبب ، أعود إلى IntelliJ.

إنه طلب طويل

أحب VS Code كثيرًا وقد بدأت للتو مشروع Node الجديد وقررت استخدام TypeScript لأول مرة. حتى الآن جيد في الغالب ، لكن هذه القضية كانت نقطة ألم. من خلال العمل في مصدر مفتوح ، فإن القدرة على النقر للوصول إلى كود المصدر الحقيقي في التبعيات أمر حيوي لتدفق العمل. أنا أعمل في ملفات مصدر TypeScript وأستخدم وحدات JS NPM مع الوحدات النمطية المرتبطة بـ @types/xxx التي لا تحتوي على وثائق مرتبطة. يعد التحسس الذكي مع TypeScript رائعًا ، ولكنه لا يوفر دائمًا معلومات كافية. على الأقل ، سيكون من الجيد أن تكون قادرًا على النقر مباشرة للوصول إلى مصدر الوحدة من بيان import . أعتقد أنه في بعض المكتبات التي تعمل ، وفي مكتبات أخرى ، مثل Passport ، لا يمكنني تجاوز أبتر TypeScript المساعدة في الوحدة النمطية @types .

يجب تسمية هذا _Bug_ وليس _Suggestion_.

يؤدي نقص التنقل في التعليمات البرمجية إلى تدمير تجربة VSCode لمطوري JavaScript.

آسف لإرسال الرسائل العشوائية ولكن وحدات عقدة البحث 😬 في الوقت الحالي

WebStorm له نفس السلوك: StackOverflow ، BugTracker

  • يحتوي VSCode على إجراءات "الانتقال إلى التعريف" و "الانتقال إلى تعريف النوع"

  • يحتوي WebStorm على إجراءات "الانتقال إلى الإعلان" و "الانتقال إلى إعلان النوع"

ولكن عند استخدام TypeScript ، يقوم كلا IDE بنفس الشيء: انتقل دائمًا إلى تعريف النوع!

"Go to Definition" و "Go to Type Definition" ، عند استخدامهما في مكتبات node_modules/ ، يأخذني كلاهما إلى ملفات .d.ts . أنا على أحدث رمز VS حتى كتابة هذه السطور (1.34.0).

على سبيل المثال: npm package @angular/[email protected] ، عندما أقوم باستيراد TestBed من @angular/core/testing وأحاول رؤية تعريف TestBed.createComponent ، أحصل على شيئين مختلفين:

  • "الانتقال إلى التعريف" -> node_modules/@angular/core/testing/src/test_bed_common.d.ts line 117
  • "انتقل إلى تعريف النوع" -> node_modules/@angular/core/testing/src/component_fixture.d.ts line 14

هذا يعني بشكل أساسي أن شفرة المصدر Angular مخفية عني في VS Code 😞 لست متأكدًا مما إذا كان هذا أحد أعراض كيفية كتابة مكتبة Angular ، أو كيف يجد TypeScript / VS Code تطبيقات المصدر.

كل ما أعرفه هو أنه لا يمكنني استخدام "Go to Definition" و "Go to Type Definition" إلا بشكل موثوق في الكود الخاص بي ، وفي هذه الحالة يتم نقلي مباشرةً إلى المصدر ؛ لم يتم عرض ملف .d.ts للرمز الخاص بي مطلقًا.

يتعين علينا البحث يدويًا في رموز المصدر في الوقت الحالي: /

لقد اكتشفت للتو أن Intellij IDEA بطريقة ما تجعل هذه الوظيفة تعمل بشكل جيد ، حتى أنا في نفس المشروع ، باستخدام Typescript 3.0.1

اعتقدت أن أولوية هذه القضية يجب أن يتم تصعيدها.

علينا الأمر + , لفتح إعدادات مساحة العمل -> قم بإلغاء تحديد Use Ignore Files -> حذف Search: Exclude: **/node_modules ، وابحث يدويًا عن رموز المصدر.

كل يوم!

لهذا السبب لا يزال flow مفيدًا.

هل يمكن لشخص من فريق الكتابة المطبوعة أن يقترح أين يمكن إصلاح هذا في الكود؟

الشيء المضحك هو أنه إذا كانت بعض الحزم لا تحتوي على أنواع متوفرة ، فإن "Go To Type Definition" يعمل بشكل أفضل معها. هذا يعني أن عدم استخدام الكتابة أفضل إذا كنت تحب ميزات "الانتقال إلى" 😄

إليك تسجيل الشاشة الذي يُظهر أنني قادر على الانتقال إلى تعريف حزم device التي لا تحتوي على طباعة ، ولكن compression يقودني إلى بعض ملفات الكتابة العشوائية:

https://giphy.com/gifs/j3VCp0LVKr5LsMUh11

RyanCavanaugh يجب أن أتفق مع الآخرين ، يجب أن يتم تصنيف هذا على أنه خطأ وليس اقتراح ..

في حالتي ، إذا كان لدي شيء مثل هذا محدد في الكود الخاص بي

const Foo: <T> = () => {
...
}

إذا كانت T تأتي من وحدة npm ، فعندما أحاول الانتقال إلى التعريف ، ستظهر لي تعريفين. الكود الخاص بي وتعريف الكتابة. إذا ذهبت إلى نوع تعريف ينتقل مباشرة إلى ملف التعريف.
في الحالة الأولى ، يجب أن ينتقل مباشرة إلى التعريف.
للتغلب على هذا ، قمت بتغيير المحرر -> الانتقال إلى الموقع: مضاعف إلى goto بدلاً من peek

أحتاج هذه الميزة. كيف يمكنني المساعدة في تنفيذه؟

+1 لهذا من فضلك!

منذ عام 2015 ولا توجد حلول :(

كان OP يسأل عما إذا كان بإمكاننا الانتقال إلى ملفات .ts عندما نجد ملفات .d.ts - إذا قمت بشحن ملفات .ts مع ملفات .d.ts والإقرار الخرائط التي تم إنشاؤها بواسطة --declarationMaps ، هذا هو سلوكنا الحالي (لذلك تم إنجازه جيدًا). الطلب _second_ في هذا الموضوع ، وهو ما نتتبعه الآن هنا ، هو خيار للانتقال إلى الملف .js (والذي يمكن أن يكون مفيدًا ، على سبيل المثال ، .ts sources aren ' ر شحنت). من ناحية التنفيذ ، هذه مجرد مسألة دمج خرائط مصدر الإعلان وخرائط مصدر جافا سكريبت التي نصدرها بالفعل ، ولكن ما لم نقرره بعد هو كيفية ظهور هذه الميزة. يحتوي رمز Go to implementation في رمز ts بالفعل على معنى مفيد لمعظم الكود (وهو الانتقال إلى التعريف ، ولكن يفضل إقرارات التنفيذ / القيمة) ... هل نقوم بتعديل ذلك بطريقة ما (على سبيل المثال ، إذا عقدنا العزم على إعلان ، حاول حل ملف js بدلاً من ذلك) ، أم نضيف نقطة نهاية جديدة؟ إذا كان لاحقًا ، فنحن بحاجة إلى التحدث عن الكيفية التي نريد أن نظهر بها مع فريق vscode.

DanielRosenwasser بصراحة ، ما نحتاجه حقًا هنا هو مجرد وصف أكثر تجسيدًا لكيفية فضح شيء كهذا بالضبط - الأدوات اللازمة للقيام بذلك موجودة الآن.

يمكن للمبرمجين من فريق vscode اقتراح أفكار حول كيفية تنفيذ ذلك ، على سبيل المثال Go to js implementation أو شيء من هذا القبيل ، ستكون الخطوة الأولى الجيدة هي إنشاء تذكرة على متتبع مشكلات vscode والإحالة الترافقية لهذه التذاكر حتى يمكن التواصل يبدأ.

ما أفهمه هو أن هناك العديد من المشاكل ذات الصلة هنا. (1) هو الأكبر ، لكن يجب أن نضع الآخرين في الاعتبار أيضًا:
1) لا توجد طريقة سهلة للانتقال إلى تنفيذ JS أو TS لنوع TS إذا تم الإعلان عن هذا النوع في حزمة DefinitelyTyped. (أو الحالات الأخرى التي لا يتم فيها تحديد موقع .d.ts مع التنفيذ)
2) Go To Type Definition لا يعمل عندما يكون التحديد بحد ذاته نوعًا. ستحصل على الخطأ "لم يتم العثور على تعريف النوع".
3) Go To Definition on معرّف غير من النوع يتصرف بشكل غير متسق. في بعض الأحيان سينتقل إلى التنفيذ ، وأحيانًا لا ينتقل. من الناحية النظرية ، هذا هو نفسه (1) ، ولكن من الممكن أيضًا حل (1) مع ترك هذا التناقض في مكانه.

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

  • يجب أن ينتقل
  • يجب أن ينتقل Go To Type Definition دائمًا إلى إعلان TS ، بغض النظر عما إذا كان التحديد من نوع أو غير معرف النوع.

هل هناك حالات استخدام شائعة أخرى لمتلازمة توريت تتطلب خيارًا ثالثًا؟

راجع للشغل ، أعتقد أنه يمكننا إعادة تسمية "الانتقال إلى التعريف" إلى "الانتقال إلى التنفيذ" إذا أردنا جعل التمييز أكثر وضوحًا ، لكن IMHO يبدو أن هذا تغيير اختياري. التناسق (بغض النظر عن الاسم) هو البت عالي الترتيب.

لا توجد طريقة سهلة للانتقال إلى تنفيذ JS أو TS لنوع TS إذا تم الإعلان عن هذا النوع في حزمة DefinitelyTyped. (أو الحالات الأخرى التي لا يتم فيها تحديد موقع .d.ts مع التنفيذ)

_ من الناحية الفنية_ إذا أردت تدوير بعض خرائط المصادر لتتماشى مع حزمة DT ، فقد يكون الأمر مناسبًا بالفعل. لكن بالتأكيد لا يوجد حل آلي هنا. يعتمد أي حل لدينا على تحسين السيناريوهات التي تتضمن إخراج مترجم TS ، في تلك الأوقات فقط يمكننا تعديل البيانات الوصفية الإضافية المطلوبة لعمل الارتباطات الصحيحة بين الملفات. بعض الحزم تدعم هذا اليوم ، على ما أعتقد - كنت أستخدم azure js sdk في اليوم الآخر وأقوم بتصحيح بعض الأشياء ، وفوجئت بسرور عندما ذهبت إلى بعض التعريفات واكتشفت أنها كانت في المصدر الأصلي. لذلك نعم، وأنها تعمل مع مصادر TS التي لديها ما يصل إلى تاريخ --declarationMaps الناتج المجمعة معهم.

لا يعمل Go To Type Definition عندما يكون التحديد بحد ذاته نوعًا. ستحصل على الخطأ "لم يتم العثور على تعريف النوع".

أعتقد أنه يجب عليك فتح مشكلة جديدة في هذا الشأن. هذا مجرد فشل exepections / bug ، imo. في الحد الأدنى ، يمكن تحسين الخطأ - شيء مثل "التحديد هو مجرد نوع وبالتالي لا يوجد تعريف للنوع مرتبط بقيمته".

الانتقال إلى التعريف على معرّف ليس من النوع يتصرف بشكل غير متسق. في بعض الأحيان سينتقل إلى التنفيذ ، وأحيانًا لا ينتقل. من الناحية النظرية ، هذا هو نفسه (1) ، ولكن من الممكن أيضًا حل (1) مع ترك هذا التناقض في مكانه.

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

كمستخدم ، سأكون راضيًا ، إذا عملت على النحو التالي:

Ctrl + النقر فوق رمز (أستخدم هذا غالبًا فقط للتنقل في الكود) يجلب حاليًا إما إلى التنفيذ (إذا كان ضمن الحزمة التي يتم تحريرها في VS Code) أو إلى الإعلان (إذا كان حزمة من التبعيات) . الأول لا يتطلب النظر. الثاني ، عندما يتعلق الأمر بالإعلان ، أود الضغط على Ctrl + النقر على الإعلان وينقلني إلى التطبيق ، إذا كان بإمكانه تحديد موقعه وتنزيله وفتحه لي. خلاف ذلك ، فإنه يعرض رسالة عن المشكلة التي حالت دون العثور على المصادر / فتحها. إذا عملت على هذا النحو ، فسيكون رائعًا.

أعتقد أن هناك السيناريوهات التالية مع تحديد موقع شفرة المصدر الأصلية:

  1. الحزمة مكتوبة بخط مكتوب ورمز المصدر الأصلي في مستودع خارجي وأيًا منهما
    أ) يتضمن التوزيع ملفات d.ts و js أو ملفات
    ب) يتضمن التوزيع ملفات d.ts و js و ts
  2. تمت كتابة الحزمة بخط مكتوب ورمز المصدر الأصلي في المستودع الحالي (حالة إعادة الشراء الأحادية) و
    أ) يتضمن التوزيع ملفات d.ts و js
  3. تمت كتابة الحزمة بجافا سكريبت وشفرة المصدر الأصلية في مستودع خارجي وأيًا منهما
    أ) يتضمن التوزيع الخاص به ملفات d.ts و js أو
    أ) يشمل التوزيع فقط js الملفات والخارجية @types تستخدم تعريفات
  4. تمت كتابة الحزمة بجافا سكريبت وكود المصدر الأصلي في المستودع الحالي (حالة إعادة الشراء الأحادية) و
    أ) يتضمن التوزيع ملفاته الخاصة بـ d.ts و js

1 ب) - نادرًا ما يتم استخدامه ، وأنا لا أحب هذا النهج لأن الموارد مثل اتجاهات الحزمة و npm ستبلغ عن أحجام حزم ضخمة ، وهي ليست ضخمة في وقت التشغيل حقًا ، لكن الناس يحكمون على الحجم بناءً على هذه الموارد. لذا ، فإن الاعتماد على القائمين على الصيانة لتضمين ملفات ts مع التوزيع ليس فكرة جيدة ، ولكن بالتأكيد إذا تم تضمين ملفات ts ، فسيتم حل القضية.

1 أ) - الحالة (الأكثر شيوعًا). يجب أن تعلن الحزمة إلى حد ما (عبر package.json أو خرائط المصدر؟) عن مكان وجود المصادر الأصلية عند تجميعها (مثل ملفات الرموز Microsoft pdb تعلن) أو أين يمكن التنزيل منها ، على سبيل المثال git + revision + طريق. ينتقل كود VS إلى الملف المحلي أو git fetch إلى ذاكرة التخزين المؤقت المحلية ويفتحه عند التنقل من الإعلان إلى التنفيذ

2 أ) - إذا كان من الممكن اكتشاف حالة إعادة الشراء الأحادي تلقائيًا (باستخدام بعض الأساليب البحثية) ، يمكن أن يفتح التنقل الأصلي Ctrl + Click التطبيق مباشرة. إذا كان ذلك مستحيلاً ، فإن الرجوع إلى 1 أ) جيد بما فيه الكفاية

أنا لا أهتم كثيرًا بـ 3 ، لكن سيكون من الجيد أن 3 أ) يمكن أن تفتح تطبيق JS في ثاني Ctrl + Click navigation. في حالة 3 ب) يجب أن تعلن الحزمة @types عن حزم JS التي تعلق عليها ، لذلك يمكن أن يحتوي كود VS على هذه المعلومات للانتقال إلى تنفيذ JS في الحزمة الخارجية.

أنا لا أهتم كثيرًا بحوالي 4 ، ولكن يمكن أن يكون لها نفس السلوك مثل 2 أ) - احتياطي لـ 4 أ) هو 3 أ)

آمل أن يساعد.

1 أ) - الحالة (الأكثر شيوعًا).

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

"حقًا ، هل تفضل الانتقال إلى ملف الإقرار ، ثم التفاعل مرة أخرى للانتقال إلى ملفات js المرتبطة؟ ألا تريد الانتقال مباشرةً إلى ملف js؟"

في حالة 1 أ) ، القفزة المزدوجة أو القفزة الفردية كلاهما جيد بالنسبة لي. على الرغم من أنه يمكن اعتبار القفزة الفردية "أكثر كفاءة" ، إلا أن القفزة المزدوجة استفادت من "تذكير" المستخدم بأن القفزة الثانية هي قفزة إلى الصندوق الأسود من وجهة نظر "استهلاك المكتبة" (على سبيل المثال ، التذكير بأن المصدر الملف الذي يتم الانتقال إليه ليس جزءًا من المشروع الحالي). ربما يمكن جعل هذا السلوك شكليًا.

في حالة 3 أ) أو 3 ب) أو 4 ، فأنا بالتأكيد أريد قفزة مزدوجة. أرغب أولاً في رؤية الإعلانات وبعد ذلك (في حالات نادرة جدًا ، مثل تصحيح الأخطاء) التنفيذ فقط. يؤدي القفز مباشرة إلى JS وتخطي إعلان TS إلى إزالة جميع مزايا الإعلانات. لذا ، فأنا بالتأكيد أريد أن أرى إعلان TS أولاً.

(دمج الردود على weswigham و avkonst من مشاركات متعددة)

ينتقل إلى التعريف الأول ، حيث يكون الأول تعسفيًا إلى حد ما ، ويستند إلى أشياء مثل ترتيب الملفات التي تم تحميلها.

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

إنتاج تعيين من .d.ts إلى .js (بدون الوسيط .ts).

لست متأكدًا من أنني أفهم "بدون TS الوسيطة". هل تقصد أنه حتى إذا كان مصدر .ts الأصلي متاحًا ، فإن VSCode سينتقل إلى ملف .js المنقول؟ تبدو فكرة سيئة. إذا كان المصدر الأصلي متاحًا ، فيجب أن يتنقل VSCode هناك - تمامًا كما يحدث عندما ينتقل مصحح الأخطاء إلى التعليمات البرمجية المترجمة التي تحتوي على خريطة المصدر. ومع ذلك ، إذا كان مؤلف الحزمة شريرًا أو كسولًا ولم يتضمن مصدر TS الأصلي في توزيعة npm الخاصة به ، فيبدو من المعقول أن يعود VSCode إلى JS المنقولة وربما يُظهر رسالة تحذير تشرح سبب رؤية المستخدم مثل هذا الرمز الغريب وغير المقروء ولتشجيع المستخدمين على تذمر مؤلف الحزمة لتضمين المصدر الأصلي في الحزمة الخاصة بهم.

حقًا ، هل تفضل الانتقال إلى ملف الإقرار ، ثم التفاعل مرة أخرى للانتقال إلى ملف js المرتبط؟ أنت لا تريد القفز مباشرة إلى js؟

لا أعتقد أن الخطوة المكونة من خطوتين ستضيف قيمة. أعتقد أنه من الأفضل أن يكون لديك تجربة مستخدم مميزة ومتسقة: استخدم "Go To Type Definition" للانتقال إلى تعريف النوع ، واستخدم Go To Definition (أو Go To Implementation - أيًا كان ما نختاره) للانتقال إلى الأصل شفرة المصدر أو ، على النحو الوارد أعلاه ، إلى JS المترجمة إذا لم يكن المصدر الأصلي متاحًا.

IMHO ، من المربك أكثر أن يكون لديك سلوك مختلف اعتمادًا على ما إذا كان الرمز المحدد محددًا في الكود الخاص بك مقابل في node_modules. لا ينبغي أن يهم. إذا كنت أرغب في رؤية النوع ، فيجب أن يأخذني VSCode إلى النوع. إذا كنت أرغب في رؤية رمز التنفيذ ، فيجب أن يأخذني VSCode إلى هناك. هذا صحيح بشكل خاص لأنه في المؤسسات الكبيرة ، ما هو "الكود الخاص بي" وما هو "رمز المكتبة" ليس دائمًا خطًا مشرقًا. إذا قام شخص آخر بإعادة بناء التعليمات البرمجية في حزمة داخلية مشتركة ، فلن أضطر إلى تغيير طريقة التنقل إلى هذا الرمز.

أرغب أولاً في رؤية الإعلانات وبعد ذلك (في حالات نادرة جدًا ، مثل تصحيح الأخطاء) التنفيذ فقط.

يبدو أنه من الواضح أن تطلب من المطور أن يختار صراحة (عن طريق اختيار عنصر قائمة واحد أو آخر) ما إذا كان يريد رؤية إعلان النوع أو عرض رمز التنفيذ. يبدو أن التنقل غير متسق اعتمادًا على مصدر الشفرة أمر مربك بلا داعٍ.

> Go To Type Definition لا يعمل عندما يكون التحديد بحد ذاته نوعًا.
أعتقد أنه يجب عليك فتح مشكلة جديدة في هذا الشأن. هذا مجرد فشل exepections / bug ، imo.

نعم ، يمكن بالتأكيد إصلاح هذا أولاً. لقد قمت بتضمينها هنا لأنه إذا تم اعتماد الحل المفضل لدي ("الانتقال إلى التعريف ينتقل دائمًا إلى التطبيق") ، فحينئذٍ يعتاد المستخدمون على استخدام تعريف Go To Type كلما أرادوا رؤية ملف d.ts. سيكون غريبًا إذا كان القيام بذلك على نوع ما لا يتصرف بشكل ثابت مع كيفية عمله لمعرف غير نوع.

"ينتقل إلى التعريف الأول ، حيث يكون الأول تعسفيًا إلى حد ما ، ويستند إلى أشياء مثل ترتيب الملفات التي تم تحميلها فيها."

لم أذكر في ردودي أنه ينبغي الانتقال إلى التعريف الأول. قلت في Ctrl + انقر فوق رمز يجب أن ينتقل أولاً وقبل كل شيء إلى التعريف (كما يعمل الآن) وفقط على Ctrl التالي + انقر فوق التنفيذ.

"يبدو أنه من الواضح أن تطلب من المطور أن يختار صراحة (عن طريق اختيار عنصر قائمة واحد أو آخر) ما إذا كان يريد رؤية إعلان النوع أو عرض رمز التنفيذ."

قوائم السياق المنفصلة جيدة وفكرة جيدة. لا يستبعد أحدهما الآخر سلوك Ctrl + Click.

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

لا أريد سماع تفسيرات فنية ، أريد أن أعرف سبب عدم الاعتراف بهذه المشكلة بعد الكثير من الوصف لمستخدمين مختلفين.

zjaml هل تريده أن ينتقل إلى ملفات مصدر TypeScript أو ملفات مصدر JavaScript؟ ملفات مصدر TypeScript مدعومة. إنها ملفات مصدر JavaScript التي لا تزال هذه المشكلة مفتوحة لها حاليًا.

مرتبط بشكل عرضي لدي monorepo مع حزمة مشتركة تم نشرها إلى npm. بسبب هذه الواجهة العامة ، يكون dist عبارة عن ملفات js + d.ts. عندما أعمل في الريبو ، يقفز VSCode دائمًا إلى d.ts بدلاً من المصدر. هل تعرف طريقة للتغلب على هذا؟

@ 0x80 أعتقد أن هذه المشكلة لا تزال مفتوحة للسيناريو الذي وصفته للتو. الطريقة الوحيدة التي أعتقد أنه يمكنك التغلب عليها هي إذا كان المشروع مفتوح المصدر وقمت بتجميعه من المصدر المطبوع. بعد ذلك ، يمكنك تشغيل علامة --dec

هذا أمر بالغ الأهمية حقًا. أريد شيئًا بسيطًا: CTLR + انقر وانتقل إلى ملف node_modules / library / source.js أو source.ts. مشروع مفتوح المصدر يحتوي على 60 تبعيات node_modules وستعود لاستخدام المفكرة مع المستكشف.

عندما نقرت بزر الماوس الأيمن على أحد المكونات رأيت: "Go to Definition" و "Go to Type Definition". اعتقدت "رائع ، لقد تم تصميم هذا بشكل جيد ، الحل لمشكلتي هنا فقط!". ثم قمت بالنقر فوق "الانتقال إلى التعريف" و ... هبطت إلى تعريف النوع.

هذا أمر بالغ الأهمية حقًا. أريد شيئًا بسيطًا: CTLR + انقر وانتقل إلى ملف node_modules / library / source.js أو source.ts. مشروع مفتوح المصدر يحتوي على 60 تبعيات node_modules وستعود لاستخدام المفكرة مع المستكشف.

+1
نفس الحاجة.

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

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

+1

حسنًا ، في هذه الأثناء عندما لا تتوفر هذه الميزة بعد ، هل هناك أي حل أفضل بجانب البحث عن وحدات_النود بأكملها؟ إنه حقًا إزعاج ...
على سبيل المثال ، انتقلت إلى التعريف وقادني ذلك إلى node_modules/@com.abc/sample/lib/core/internal/abc.d.ts عندما يكون العنصر الذي أريده موجودًا بالفعل عند node_modules/@com.abc/sample/src/core/internal/abc.ts

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

هل هناك أي حل أفضل إلى جانب البحث عن العقدة_الوحدات بأكملها؟

الحل الحالي AFAIK هو التصريح عن الخرائط . هذه هي خرائط المصادر التي تعين ملفات .d.ts لمصدر TS المقابل. إذا تمكنت من إقناع المكتبات التي تعتمد عليها في تنفيذ خرائط التصريح (والتي أعتقد أنها تتطلب بشكل فعال نشر .d.ts داخل حزمة المكتبة بدلاً من الاعتماد علىtypes) ، فستتمكن من القفز تلقائيًا من رمز العميل الخاص بك إلى شفرة المصدر TS الأصلية (أو حتى JS في حالة استخدام مترجم TS على JS؟).

ما كنت أفعله هو حفظ العلاقات العامة تدريجيًا مقابل تبعياتي الأكثر أهمية (على الأقل تلك التي تم تأليفها في TS) لحملهم على إضافة خرائط التصريح.

من الواضح أنه سيكون من الأفضل إذا لم يكن تغيير المكتبة مطلوبًا.

يعمل حل بديل آخر (إذا لم يكن تغيير المكتبة ممكنًا) في حالة حزم المكتبة .d.ts داخل الحزمة ولكن لا تحتوي على خرائط إعلان. في هذه الحالة ، سأستخدم Go To Definition للوصول إلى إعلان النوع ، ثم سأضغط على زر Explorer في VSCode لإظهار الشريط الجانبي للمجلد. هذا عادة ما يجعلني قريبًا جدًا من المجلد src للحزمة ، لذلك بدلاً من الاضطرار إلى البحث في جميع وحدات node_modules ، يمكنني فقط تصفح المجلد الصحيح وفتح الملف الصحيح. هذا يعتمد على تسمية الملفات الواضحة ، وما إلى ذلك ، وهو ليس حلاً سحريًا.

فقط لأكون واضحًا بنسبة 100٪ - أرغب في رؤية حل أفضل للمكتبات ، خاصة. تلك حيث تم تأليف .d.ts بشكل منفصل عن الحزمة.

لست متأكدًا مما إذا كنت قد فاتني ذلك ، ولكن سيكون من المفيد حقًا فهم ما يحدث للحصول على أمثلة فعلية قليلة من المصادر والإعلانات وخرائط الإعلان. لم أر مطلقًا الانتقال إلى التعريف ، أو الانتقال إلى تعريف النوع ، أو الانتقال إلى التطبيقات ، فعليًا الانتقال إلى أي شيء ما عدا ملف .d.ts لـ TS المنقول. لقد حاولت فقط أن أجعل مثالًا بسيطًا ، ولكنه لا يعمل ؛ لا يمكنني الحصول على رمز VS للانتقال إلى أي شيء غير الملف .d.ts ، على الرغم من أن .d.ts.map بجواره. لقد وجدت أيضًا شخصًا آخر يعاني من نفس المشكلة وتم تجاهله.

من المفهوم أن دعم عمليات الكتابة الخارجية مثل @types سيكون صعبًا ، ولكن ماذا يقول أنه حتى "المسار السعيد" لا يمكن تفعيله؟

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

نعم ، أؤكد أن خرائط التصريح لا تحل المشكلة. يحتوي مشروعي على خرائط إعلان ولكن vscode لا يتنقل خارج ملفات .d.ts.

بالتأكيد سيكون رائعًا إذا حدث هذا.

إذا كان هناك "فيل في الغرفة" من المشكلات لـ ms vscode devs ، فهذه هي المشكلة.

أي تحديثات على هذه؟
لقد قررت للتو اتخاذ خطوة كبيرة: الانتقال من JS إلى TS. فكرت - "ما الخطأ الذي أفعله؟" ولكن في الواقع ، إنه سلوك غير متوقع لـ VSCode

أي تحديثات على هذه؟
لقد قررت للتو اتخاذ خطوة كبيرة: الانتقال من JS إلى TS. فكرت - "ما الخطأ الذي أفعله؟" ولكن في الواقع ، إنه سلوك غير متوقع لـ VSCode

لقد كان تاريخًا طويلًا منذ أن أثير هذا السلوك. حسنًا ، لا شيء يحدث هنا. لا توجد خطة حتى الآن.
بالنسبة لي ، أواصل استخدام vscode كنوع من المحرر كما هو ، ومنتجات Intellij (IDEA) لمواد الترميز الخاصة بي حتى أنني لا أحبها كثيرًا.

افتتح لمدة 5 سنوات ، ونأمل أن يتم إصلاحه في عام 2025

لقد أنشأت اختبارات فاشلة في # 39426 لكني لا أعرف كيفية تنفيذها

مجرد تعليق بائس آخر من ts dev يمر بالجحيم كل يوم للعثور على تعريفات

هذا جنون ... اعتقدت أنني مجرد مستجد TS ، لكن الآن أرى أن السلوك الذي أحصل عليه هو في الواقع "قياسي" ؟؟؟؟ محبط للغاية ، كل لغة IDE / لغة أخرى استخدمتها تم تنفيذها في الإصدار الأولي ... :( أنا أحب رمز VS ولكن الصدق قد يكون هذا بمثابة كسر للصفقة

هل يمكن لأي شخص أن يشرح لماذا go to definition/implementation ميزات في VSCode مع امتدادات Python ، هاه ، تعمل لغة Python بشكل أفضل (إنها تعمل على الأقل) ثم بالنسبة لـ JS التي لديها حلول مدمجة أصلية؟

ماذا يحدث؟
أنا أستخدم scss.d.ts لوحدات css ولا يمكنني الانتقال إلى scss.

أيضًا عند إنشاء ملفات .js بسيطة وبناءً عليه d.ts ، لا يمكنني القفز مباشرة إلى js

لماذا لا تستخدم Webstorm؟
يمكن أن تحل هذه المشكلة !!!
نسختى 2020.1

لماذا لا تستخدم Webstorm؟
يمكن أن تحل هذه المشكلة !!!
نسختى 2020.1

لأنه ليس حلاً مفتوح المصدر وليس مجانيًا

الرجاء إصلاح هذا.

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

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

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

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

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

Roam-Cooper picture Roam-Cooper  ·  3تعليقات

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

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