Typescript: يؤدي إصلاح رمز "تجاهل رسالة الخطأ هذه" في JSX إلى عرض `// @ ts-ignore`

تم إنشاؤها على ٤ أكتوبر ٢٠١٨  ·  22تعليقات  ·  مصدر: microsoft/TypeScript


إصدار TypeScript: 3.2.0-dev.20181004


مصطلحات البحث:

تعطيل JsDiagnostics
JSX
إصلاح التعليمات البرمجية
تجاهل رسالة الخطأ هذه
أضف "@ ts-ignore" إلى كافة رسائل الخطأ

الشفرة

// MyComponent.jsx
// @ts-check
import React from "react";

class MyComponent extends React.Component {
  render() {
    return (
      <div>
        // @ts-ignore
        {doesNotExist}
      </div>
    );
  }
}

export default MyComponent;

يؤدي تشغيل إصلاح الكود Ignore this error message أو Add '@ts-ignore' to all error messages // @ts-ignore الذي يرضي المترجم.

لكن،

<div>
  // @ts-ignore
  {doesNotExist}
</div>

سيتم عرض // @ts-ignore .

سلوك متوقع:

يبدو أن {/* @ts-ignore */} أو {/* // @ts-ignore */} لم يتم التعرف عليه كتعليقات تجاهل صالحة.

لذا ، فإن أفضل ما يمكنني التوصل إليه هو

<div>
  {/* 
  // @ts-ignore */}
  {doesNotExist}
</div>

السلوك الفعلي:

// MyComponent.jsx
// @ts-check
import React from 'react';

class MyComponent extends React.Component {
  render() {
    return (
      <div>
        // @ts-ignore
        {doesNotExist}
      </div>
    );
  }
}

export default MyComponent;

حيث يتم عرض // @ts-ignore عن طريق الخطأ.

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

https://github.com/Microsoft/TypeScript/issues/25240

Bug JSTSX Quick Fixes

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

(ما لم نفكر حقًا في شيء مثل

{/* 
  // @ts-ignore */}

هل هو جيد؟)

ال 22 كومينتر

يرجى ملاحظة ما يلي: ما لم نقم بإضافة نماذج قمع جديدة (على سبيل المثال ، مضمنة) ، فإن الإصلاح الوحيد لذلك هو تعطيل الإصلاح السريع عندما يتعذر إنشاء موضع منع صالح.

(ما لم نفكر حقًا في شيء مثل

{/* 
  // @ts-ignore */}

هل هو جيد؟)

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

const s = `
Hello ${doesnotexist}`;

يحصل تجاهل الإصلاح مثل

const s = `
Hello ${
// @ts-ignore
doesnotexist}`;
{/* 
  // @ts-ignore */}

رهيبة 🌹

هل هناك نمط آخر يستخدمه الآخرون؟

هذا هو حقا بناء جملة غريب

{/* 
  // @ts-ignore */}

تحرير ما ورد أعلاه لا يعمل في الواقع.

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

شكل آخر (غريب المظهر) يعمل:

<
// @ts-ignore
SomeComponent />

(ما لم نفكر حقًا في شيء مثل

{/* 
  // @ts-ignore */}

هل هو جيد؟)

كم انت ذكي !!!

تحرير ما ورد أعلاه لا يعمل في الواقع.

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

يعمل مقابل .tsx مع Typescript 3.6.2

(ما لم نفكر حقًا في شيء مثل

{/* 
  // @ts-ignore */}

هل هو جيد؟)

نعم ، ستكون كل قواعد الفحص هذه سعيدة جدًا بهذا النحو

افعل هذا الآن:

    <   // eslint-disable-line react/jsx-tag-spacing
        // @ts-ignore
    Component/>

لقد واجهت المزيد من المرح في الكتابة المطبوعة 3.7 جنبًا إلى جنب مع أجمل ، لأن الأجمل تحتفظ بالسمات في سطر منفصل ، والآن يجب وضع @ ts-ignore مباشرة قبل الخاصية ، وليس بداية العلامة.

هذا هو الحل الذي لدي:

{/* lol https://github.com/Microsoft/TypeScript/issues/27552#issuecomment-495830020
      // @ts-ignore */ /* prettier-ignore */}
    <MyComponent foo={{
        a: 'prop',
        with: 'lots a',
        big: 'object',
        that: 'forces',
        prettier: 'to wrap',
      }}
    />

سابقا:

    {/* lol https://github.com/Microsoft/TypeScript/issues/27552#issuecomment-495830020
      // @ts-ignore */}
    <MyComponent
      foo={{
        a: 'prop',
        with: 'lots a',
        big: 'object',
        that: 'forces',
        prettier: 'to wrap',
      }}
    />

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

    <MyComponent
      {...{}/* lol https://github.com/Microsoft/TypeScript/issues/27552#issuecomment-495830020
      // @ts-ignore */}
      foo={{
        a: 'prop',
        with: 'lots a',
        big: 'object',
        that: 'forces',
        prettier: 'to wrap',
      }}
    />

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

لماذا هذا مغلق؟ هل التزمنا للتو بالحل القبيح؟

أعد الفتح من فضلك ...

هل التزمنا للتو بالحل القبيح؟

نعم. الإصلاح السريع الآن يفعل الشيء القبيح. "الجمال" ليس مصدر قلق عندما يتعلق الأمر بالقمع الذي يجب أن يكون ، بكل الحقوق ، أحداثًا استثنائية. نحن مؤمنون تمامًا بما يسمح به بناء الجملة jsx ، لذلك فهو حقًا ما هو عليه.

نحن بالتأكيد ملتزمون بالحل الهارب ... لكن ربما لا.

هل يمكننا التصويت / الاتفاق على إبقاء هذا مفتوحا؟ أرغب في معالجة هذا الأمر في وقت فراغ ولكن لا أريد إضاعة الوقت إذا كان الحل الحالي هو الخيار المفضل.

متفق عليه. أستخدم حاليًا الحل fugly لأن مكتبة تابعة لجهة خارجية أعتمد عليها بها كتابة غير صحيحة في أحدث رمز لها. يعمل Fugly solution في الوقت الحالي ، ولكن سيكون من الجيد أن يكون لديك خط واحد إن أمكن.

للأسف ، لا توجد طريقة أخرى للحصول على تعليق في jsx. يجب أن يكون ضمن {} .

هل هناك قضية منفصلة لتتبع إمكانية ذلك؟

{/* @ts-ignore */}
{whatever}

يبدو أننا منفتحون عليها الآن: https://github.com/microsoft/TypeScript/issues/37738
العلاقات العامة هنا: https://github.com/microsoft/TypeScript/pull/38228 🎉

وأنا شخصيا أعتقد

{/* @ts-ignore */}
{whatever}

هو الحل الأفضل والأكثر عالمية لهذا الغرض.

قد تفسد أدوات التنسيق التلقائي (أجمل ، وما إلى ذلك) أدناه الاختراقات.

ملحوظة:
هذا الحل يعمل بشكل جيد

{/* 
  // @ts-ignore */}

بينما هذا

<
// @ts-ignore
SomeComponent />

تم تنسيقه تلقائيًا ويصبح غير صالح (على الأقل في إعدادات أجمل)

بناءً على نجاح # 38228 ، أعتقد أن هذا هبط في 3.9: tada:

أعتقد أن هذه مشكلة في JSX ، لكن تحقق من ذلك:

لنفترض أن لدي هذا :

import * as React from 'react';

declare var SomeComponentFromLibrary: React.FC<{
    children?: React.ReactElement
}>;

declare var MyComponent: React.FC<{
    foo: string,
}>;

export default () => (
    <SomeComponentFromLibrary>
        {/* @ts-expect-error */}
        <MyComponent />
    </SomeComponentFromLibrary>
)

SomeComponentFromLibrary لا يمكنني التغيير ، وأرغب في إلغاء الخطأ الذي يولده <MyComponent /> .

ومع ذلك ، فإن إضافة عنصر آخر إلى العناصر الأبناء لـ SomeComponentFromLibrary الآن يكسر قيد النوع children?: React.ReactElement ، مما ينتج عنه خطأ من نوع آخر.

هل من الممكن إنشاء تعليقات في JSX لا تتحول إلى كود؟

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

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

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

Antony-Jones picture Antony-Jones  ·  3تعليقات

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

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

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