Tslint: no-unused-variable TypeError: لا يمكن قراءة الخاصية '1' من القيمة null

تم إنشاؤها على ١٧ مايو ٢٠١٨  ·  14تعليقات  ·  مصدر: palantir/tslint

تقرير الشوائب

  • __ إصدار TSLint__: 5.10.0
  • __نسخة TypeScript__: 2.8.1
  • __جري TSLint عبر__: CLI

يتم فحص كود TypeScript

import { A, B, C } from './file';

console.log('No imports used');

export const D = 4;

بتهيئة tslint.json :

{
  "rules": {
    "no-unused-variable": [true, {"ignore-pattern": "^_"}]
  }
}

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

The 'no-unused-variable' rule threw an error in '/Users/andrew.mitchell/Documents/Projects/test/test.ts':
TypeError: Cannot read property '1' of null
    at walk (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:105:54)
    at Rule.AbstractRule.applyWithFunction (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/language/rule/abstractRule.js:39:9)
    at Rule.applyWithProgram (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/rules/noUnusedVariableRule.js:32:21)
    at Linter.applyRule (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:194:29)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:85
    at Object.flatMap (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/utils.js:151:29)
    at Linter.getAllFailures (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:139:32)
    at Linter.lint (/Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/linter.js:99:33)
    at /Users/andrew.mitchell/Documents/test/node_modules/tslint/lib/runner.js:209:32
    at step (/Users/andrew.mitchell/Documents/test/node_modules/tslint/node_modules/tslib/tslib.js:133:27)

سلوك متوقع

يجب أن تحذر القاعدة All imports in import declaration are unused. للسطر 1.

يحدث هذا بسبب noUnusedVariableRule.ts # L123 لأن الرسالة failure هي All imports in import declaration are unused. ، والتي لا تحتوي على اسم متغير ليتم العثور عليه في regex.

تعمل هذه القاعدة بشكل صحيح إذا لم يتم تحديد الخيار ignore-pattern لأنه لن يحاول التحقق من اسم المتغير.

Fixed Bug

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

تحديد noUnusedLocals و noUnusedParameters في compilerOptions ليس هو نفسه تمامًا مثل no-unused-variable الخاص بـ tslint. اعتبارًا من الآن ، إما أن تتسبب المتغيرات غير المستخدمة في تعطل البنية أو تظل غير ملحوظة ولا يوجد وضع تحذير بعد الآن 😞

ال 14 كومينتر

البحث الجيدhotforfeature. لقد بدأت في معالجة هذا الأمر في https://github.com/palantir/tslint/pull/3919 لأنه يتعلق ببعض التغييرات القادمة في TS 2.9 والتي لن تؤدي إلا إلى تفاقم هذه المشكلة.

يمنع PR الخاص بي من طرح استثناء ، ومع ذلك ، فإنه يتجاهل ببساطة ignorePattern في الحالات التي ذكرتها والتي ليست رائعة. أعتقد أننا سنحتاج إلى إضافة نوع من الأكواد المعقدة مثل ما نفعله لاستيراد التصحيحات التلقائية الآن: /

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

بقدر ما أستطيع أن أرى ، الفائدة الرئيسية لهذه القاعدة هي ignore-pattern ، لكن من الصعب تنفيذ ذلك بشكل صحيح بالطريقة التي تتم بها كتابة القاعدة الآن للاعتماد على تشخيصات tsc. يعتبر TSLint أيضًا أكثر مرونة بقليل من tsc w / فيما يتعلق بتعطيل القواعد في ملفات معينة. suchanlee أي أفكار حول كل هذا؟ أعلم أنك قد أصلحت هذه القاعدة مؤخرًا

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

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

أود أن أؤيد اقتراح

hotforfeature - اعترف بحالة الاستخدام الخاصة بك ووجدها معقولة. ومع ذلك ، نظرًا لتعقيد القاعدة ، أعتقد أننا سنقوم بإهمالها (انظر # 3919).

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

لما يستحق:

{
  "compilerOptions":  {
    "noUnusedLocals": true,
    "noUnusedParameters": true,
  }
}

استخدام ما ورد أعلاه في tsconfig يسمح بتعطيل قاعدة lint no-unused-variable .

no-unused-variable متوقف الآن ، و compilerOptions أعلاه هو الحل الرسمي الآن.

تحديد noUnusedLocals و noUnusedParameters في compilerOptions ليس هو نفسه تمامًا مثل no-unused-variable الخاص بـ tslint. اعتبارًا من الآن ، إما أن تتسبب المتغيرات غير المستخدمة في تعطل البنية أو تظل غير ملحوظة ولا يوجد وضع تحذير بعد الآن 😞

giladgray ، كتب killtheliterate :

يسمح استخدام ما سبق في tsconfig بتعطيل قاعدة النسالة غير المستخدمة.

لا أريد تعطيل هذه القاعدة ، لأنه كما كتب kachkaev

تحديد noUnusedLocals و noUnusedParameters في compilerOptions ليس هو نفسه تمامًا مثل no-unused-variable بـ tslint

حالة الاستخدام الخاصة بي هي رمز تم إنشاؤه. أريد أن يتبع الكود الخاص بي المكتوب يدويًا هذه القاعدة ، ولكن لتجنب جعل منشئ الشفرات معقدًا بشكل كبير ، أود تعطيل هذه القاعدة في الكود المُنشأ (أو على الأقل في بعض أقسام الكود المُنشأ) - وهذا شيء ما يمكن ' أن يتم ذلك باستخدام خيارات برنامج التحويل البرمجي TypeScript 😞

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

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

👋 أيها الناس - فقط قم بربط هذا بـ https://github.com/palantir/tslint/issues/4232. من المفهوم جيدًا والمتفق عليه أن خيارات المحول البرمجي المضمنة _ ليست بديلاً كافيًا لـ no-unused-variable . لم يعمل التنفيذ الأصلي للقاعدة بشكل جيد مع أدوات TS الأخرى وكان لابد من تعطيله. # 4232 المسارات لإيجاد طريقة لتمكينها مرة أخرى.

في غضون ذلك ، يمكنك استخدام شيء مثل tsc --noEmit --noUnusedLocals --noUnusedParameters كأداة منفصلة لاستخدام الشيكات المضمنة. نعم ، هذا ليس جيدًا مثل no-unused-variables القابل للتكوين.

أكمل المناقشة في # 4100 & # 4232

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