Tslint: TypeError no-unused-variable: Tidak dapat membaca properti '1' dari null

Dibuat pada 17 Mei 2018  ·  14Komentar  ·  Sumber: palantir/tslint

Laporan Bug

  • __TSLint versi__: 5.10.0
  • __TypeScript versi__: 2.8.1
  • __Menjalankan TSLint melalui__: CLI

Kode TypeScript sedang dilinting

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

console.log('No imports used');

export const D = 4;

dengan konfigurasi tslint.json :

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

Perilaku sebenarnya

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)

Perilaku yang diharapkan

Aturan harus memperingatkan All imports in import declaration are unused. untuk baris 1.

Ini disebabkan oleh noUnusedVariableRule.ts#L123 karena pesan failure adalah All imports in import declaration are unused. , yang tidak memiliki nama variabel di dalamnya untuk ditemukan oleh regex.

Aturan ini berfungsi dengan benar jika opsi ignore-pattern tidak ditentukan karena tidak akan mencoba memeriksa nama variabel.

Fixed Bug

Komentar yang paling membantu

Mendefinisikan noUnusedLocals dan noUnusedParameters di compilerOptions tidak sama dengan no-unused-variable tslint. Sampai sekarang, vars yang tidak digunakan merusak build atau tetap tidak diperhatikan dan tidak ada mode peringatan lagi

Semua 14 komentar

Selamat menemukan @hotforfeature. Saya mulai membahas ini di https://github.com/palantir/tslint/pull/3919 karena ini terkait dengan beberapa perubahan yang muncul di TS 2.9 yang hanya akan memperburuk masalah ini.

PR saya mencegah pengecualian dari dilemparkan, namun, itu hanya mengabaikan ignorePattern dalam kasus yang Anda sebutkan yang tidak bagus. Saya yakin kita perlu menambahkan beberapa kode kompleks seperti yang kita lakukan untuk mengimpor perbaikan otomatis sekarang :/

Saya bertanya-tanya apakah kita harus menghentikan aturan ini. tsc sekarang menyediakan cara untuk mengabaikan peringatannya, dan menyediakan dukungan untuk perbaikan otomatis untuk peringatannya melalui IDE.

Sejauh yang saya bisa lihat, manfaat utama dari aturan ini adalah ignore-pattern , tetapi sulit untuk menerapkannya dengan benar seperti aturan yang sekarang ditulis untuk bergantung pada diagnostik tsc. TSLint juga sedikit lebih fleksibel daripada tsc w/ dalam hal menonaktifkan aturan di file tertentu. @suchanlee ada pemikiran tentang semua ini? Saya tahu Anda telah memperbaiki aturan ini baru-baru ini

Kasus penggunaan utama saya untuk aturan ini adalah untuk memperbaiki masalah secara otomatis pada komit di git hook saat linting. Jadi saya masih berpikir ada nilai bagus di sini bahkan jika tsc menawarkan sesuatu melalui integrasi IDE.

@JKillian saya pikir aturannya mulai menjadi semakin mahal untuk didukung dengan dukungan TSLint untuk beberapa versi TypeScript dan perubahan berkelanjutan dalam perilaku TypeScript. Dan karena TypeScript mendukung fitur tersebut, kita harus condong untuk menggunakannya. Tetapi karena versi TS sebelumnya tidak mendukungnya, saya tidak berpikir bahwa kita harus menghapusnya. Namun saya pikir kita harus mulai berpikir tentang mencela aturan dan bekerja dengan orang-orang TS untuk lebih mendukung alur kerja TSLint saat ini dengan TS.

Saya akan mendukung proposal

@hotforfeature - akui usecase Anda dan anggap masuk akal. Namun, karena kerumitan aturan, saya pikir kita akan menghentikannya (lihat #3919).

Seperti biasa, siapa pun dipersilakan untuk menyalin kode sumber aturan dan memindahkannya ke paket eksternal dan tetap menggunakan/meningkatkannya seperti itu!

Untuk apa nilainya:

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

Menggunakan di atas dalam tsconfig memungkinkan aturan lint no-unused-variable dinonaktifkan.

no-unused-variable sekarang tidak digunakan lagi, dan compilerOptions atas adalah solusi resmi sekarang.

Mendefinisikan noUnusedLocals dan noUnusedParameters di compilerOptions tidak sama dengan no-unused-variable tslint. Sampai sekarang, vars yang tidak digunakan merusak build atau tetap tidak diperhatikan dan tidak ada mode peringatan lagi

@giladgray , @killtheliterate menulis:

Menggunakan di atas dalam tsconfig memungkinkan aturan lint no-unused-variable untuk dinonaktifkan.

Saya tidak ingin menonaktifkan aturan ini, karena seperti yang ditulis @kachkaev

Mendefinisikan noUnusedLocals dan noUnusedParameters dalam compilerOptions tidak sama dengan no-unused-variable tslint

Kasus penggunaan saya adalah kode yang dihasilkan. Saya ingin kode saya yang ditulis secara manual mengikuti aturan ini, tetapi untuk menghindari pembuatan pembuat kode yang sangat rumit, saya ingin menonaktifkan aturan ini dalam kode yang dihasilkan (atau setidaknya di beberapa bagian dari kode yang dihasilkan) - itulah yang bisa' t dilakukan dengan opsi kompiler TypeScript

Setidaknya, penghentian ini harus didokumentasikan di situs web TSLint , tetapi saya sangat setuju bahwa penghentian ini terlalu dini. Ada rencana untuk mempertimbangkan kembali? Apakah kontribusi komunitas akan diterima?

Penghinaan ini konyol. Bendera kompiler adalah pengganti yang MENGERIKAN. Mereka merusak bangunan dan tidak memperbaiki diri mereka sendiri. Bagaimana itu solusi yang masuk akal untuk mengarahkan orang? Jika opsi ignore-pattern terlalu sulit untuk dijalankan sekarang, hentikan itu.

teman-teman - cukup tautkan ini ke https://github.com/palantir/tslint/issues/4232. Ini dipahami dengan baik & disetujui bahwa opsi kompiler bawaan _not_ pengganti yang cukup untuk no-unused-variable . Implementasi asli aturan tersebut tidak cocok dengan perangkat TS lainnya dan harus dinonaktifkan. #4232 melacak menemukan cara untuk mengaktifkannya kembali.

Sementara itu, Anda dapat menggunakan sesuatu seperti tsc --noEmit --noUnusedLocals --noUnusedParameters sebagai alat terpisah untuk menggunakan pemeriksaan bawaan. Ya, itu tidak sebagus no-unused-variables dikonfigurasi.

lanjutkan diskusi di #4100 & #4232

Apakah halaman ini membantu?
0 / 5 - 0 peringkat