Tslint: Permintaan fitur: izinkan mengecualikan file untuk aturan tertentu

Dibuat pada 25 Mar 2016  ·  14Komentar  ·  Sumber: palantir/tslint

Masalah

Saya ingin menggunakan aturan "nama kelas" untuk semua file TypeScript di proyek saya, kecuali satu file, yang dihasilkan.

Format konfigurasi opsi aturan saat ini

Berdasarkan dokumentasi

Opsi aturan dapat berupa nilai benar/salah boolean yang menunjukkan apakah aturan digunakan atau atau daftar [boolean, ...] di mana boolean memberikan hal yang sama seperti dalam kasus non-daftar, dan daftar lainnya adalah opsi untuk aturan yang akan menentukan apa yang diperiksanya

Jadi pada dasarnya jika saya ingin mengaktifkan aturan, saya hanya memiliki dua opsi dalam hal format opsi aturan seperti yang ditunjukkan di sini:

{
    "rules": {
        "class-name": true,
        "some-otherrule": [ true, arg1, arg2, arg3],
        ...
    }
}

Jadi format saat ini tidak memungkinkan saya untuk mengaktifkan/menonaktifkan aturan khusus untuk beberapa file. Jika saya ingin mengecualikan satu file dari pemeriksaan kesalahan, maka saya harus mengecualikan file itu untuk semua aturan.

Mengusulkan format konfigurasi opsi aturan tambahan

Untuk mengizinkan pengecualian beberapa file, format lanjutan

list [boolean, ...] di mana boolean memberikan hal yang sama seperti pada kasus non-daftar
"some-otherrule": [ true, arg1, arg2, arg3],

dapat diperpanjang sehingga argumen pertama dapat berupa boolean (seperti sekarang) atau array (atau mungkin objek akan lebih jelas dibandingkan dengan array?) yang mendefinisikan file yang disertakan/dikecualikan.

Saya memikirkan sintaks berikut:
"some-otherrule": [ [includeGlobPattern, excludeGlobPattern], arg1, arg2, arg3],
Misalnya
"some-otherrule": [ ["**/*", "**/generated.ts"], arg1, arg2, arg3],
atau mungkin jika objek akan digunakan sebagai pengganti array, sintaks follwogin akan lebih mudah:
"some-otherrule": [ {exclude: "**/generated.ts"}, arg1, arg2, arg3],
di mana sertakan properti akan menjadi default untuk semua file.

API Feature Request

Komentar yang paling membantu

Saya memiliki kasus penggunaan yang mirip dengan @Chowarmaan.

Saya memiliki file uji *.test.ts di mana saya menggunakan dependensi dev, misalnya enzyme .
Di tslint.json saya mengaktifkan aturan no-implicit-dependencies dan saya ingin menonaktifkan aturan ini hanya untuk *.test.ts . File-file tes itu tidak semuanya ada di folder yang sama jadi sekarang saya harus meletakkan:

/* tslint:disable:no-implicit-dependencies */

di awal setiap file tes yang mengganggu

Semua 14 komentar

Mengapa Anda tidak menggunakan saja:

/* tslint:disable:class-name */
// your generated file here

Apakah ini tidak berhasil?

Itu memang dapat digunakan untuk membuatnya berfungsi, tetapi saya mengajukan permintaan fitur ini untuk menghindari modifikasi generator TypeScript (atau menambah kerumitan pada proses pembuatan, dengan menambahkan file yang dihasilkan dengan petunjuk tslint).
Menggunakan wildcard juga bermanfaat untuk secara deklaratif menerapkan aturan tertentu ke hanya jenis sumber tertentu (main/unitTests/e2eTests) dari konfigurasi tslint, bukan dari setiap file satu per satu.

Bagaimana menurut anda?

Jika Anda tidak ingin memberikan komentar pada file, maka jangan berikan file tersebut ke tslint untuk linting, bukan?

Rasanya terlalu berat untuk menambahkan opsi lebih lanjut di tempat lain ketika setidaknya ada dua cara untuk mencapai pengecualian file (sebagian)

Jika Anda tidak ingin memberikan komentar pada file, maka jangan berikan file tersebut ke tslint untuk linting, bukan?

Itulah yang saya lakukan, tetapi sekarang tidak ada aturan yang diperiksa terhadap file yang dikecualikan.

Rasanya terlalu berat untuk menambahkan opsi lebih lanjut di tempat lain ketika setidaknya ada dua cara untuk mencapai pengecualian file (sebagian)

Ya, itulah yang saya antisipasi sebagai jawaban ;) Saya juga memiliki beberapa keraguan - setidaknya tentang implementasinya (yang saya coba buat sesederhana mungkin).

Pada kenyataannya jika ini diterapkan, itu akan bermanfaat, jika Anda dapat menentukan konstanta untuk menyertakan dan mengecualikan pola, jadi Anda tidak harus menyalin-melewati pola include/exclude yang sama ke semua aturan di mana Anda ingin memfilter file yang sama ... Saya pikir mungkin tidak masuk akal untuk membuat contoh lebih rumit, tetapi saya memikirkan hal seperti itu:

{
    "constants": {
        "generatedFilesGlob": "**/generated.ts",
        "someOtherConstant": "some other value, that could be reused",
        ...
    },
    "rules": {
        "class-name": true,
        "some-otherrule": [ true, "arg1", "arg2", "arg3"],
        "rule-with-exclude": [ {"exclude": "generatedFilesGlob"}, "arg1", "arg2", "arg3"],
        ...
    }
}

tetapi itu akan membuat file konfigurasi lebih sulit untuk diuraikan. Itu membuat saya berpikir tentang mendukung file js untuk konfigurasi, selain file json. Sebagai contoh:

const generatedFilesGlob = "**/generated.ts";
const allExceptGenerated = {exclude: generatedFilesGlob};
module.exports = {
    "rules": {
        "class-name": true,
        "some-otherrule": [ true, "arg1", "arg2", "arg3"],
        "rule-with-exclude": [ allExceptGenerated , "arg1", "arg2", "arg3"],
        "another-rule-with-the-same-exclude-pattern": [ allExceptGenerated , "arg1", "arg2", "arg3"],
        ...
    }
}

Menggunakan file JavaScript dengan modul (seperti yang dilakukan gulp) memiliki manfaat lain - memungkinkan berkomentar dan tidak terlalu ketat tentang koma setelah elemen terakhir dalam array atau properti di objek.

@atsu85 masalah menarik, tetapi seperti yang ditunjukkan @myitcv, saya enggan memasukkan daftar file / gumpalan ke tslint.json karena kompleksitas / kekacauan tambahan dalam file konfigurasi. Saya setuju bahwa TSLint harus menerima file .js untuk konfigurasi selain file .json . Saya pikir itu akan membantu Anda mengatasi kasus penggunaan -- Anda dapat mengatur dua tugas pembuatan tslint (satu untuk sumber reguler Anda, satu untuk sumber yang dihasilkan) dan secara terprogram menonaktifkan aturan class-name dalam satu dari mereka dalam file tslintConfig.js .

Mengajukan #1065 untuk mendukung file konfigurasi .js

Cukup adil, saya akan menutup masalah ini demi file konfigurasi js saja

Saya memiliki kasus penggunaan untuk ini yang mungkin masuk akal. Saya memiliki file pengujian (*.spec.ts) yang ingin saya bagikan sebagian besar aturan TSLint TypeScript saya, karena praktik pengkodean yang baik juga berlaku untuk pengujian saya.

Namun, saya menguji beberapa konstanta yang dikonfigurasi untuk aturan 'angka ajaib', agar tidak memiliki 5 dalam kode saya:
(Foo.substr(0,5);
tapi pastikan itu adalah const
(Foo.substr(0,CONSTANT.FIVE);

Dengan demikian, kasus pengujian saya untuk const saya yang disertakan dari file umum, memiliki tes untuk memastikan bahwa const LIMA = 5 selalu disetel. Tes kemudian expect(CONSTANTS.FIVE).toBe(5); gagal dalam pemeriksaan TSLint karena angka ajaib digunakan dalam tes. Meskipun saya tidak menguji semua konstanta dengan cara ini, saya ingin memeriksa pengaturan numerik ini untuk memastikan mereka tidak berubah karena mereka diharapkan tetap dalam ukuran tertentu.

Saya dapat menggunakan dua konfigurasi TSLint yang berbeda, tetapi saya benar-benar ingin menghindarinya agar tidak sinkron, atau saat menambahkan aturan baru, harus melakukannya di banyak tempat.

Saya dapat melakukan /* tslint:disable :no-magic-numbers*/ untuk satu file untuk tes khusus ini yang berfungsi untuk saya, tetapi mungkin beberapa kasus lain dalam file tes, aturan umum mungkin perlu menjadi pengecualian, dan alih-alih memperbarui setiap *.spec.ts, pola global untuk aturan akan berfungsi?

Saya memiliki kasus penggunaan yang mirip dengan @Chowarmaan.

Saya memiliki file uji *.test.ts di mana saya menggunakan dependensi dev, misalnya enzyme .
Di tslint.json saya mengaktifkan aturan no-implicit-dependencies dan saya ingin menonaktifkan aturan ini hanya untuk *.test.ts . File-file tes itu tidak semuanya ada di folder yang sama jadi sekarang saya harus meletakkan:

/* tslint:disable:no-implicit-dependencies */

di awal setiap file tes yang mengganggu

Ini adalah masalah serupa yang saya hadapi serta @RomanGotsiy di mana Anda dapat menambahkan

Ini. 100%. Mengalami masalah ini dengan monorepo di mana dependensi pengujian terdaftar di ruang kerja sehingga tslint menangis tentang no-implicit-dependencies . Itu harus dilakukan dengan satu file konfigurasi sehingga IDE linting masih berfungsi

Saya pikir masalah ini juga terkait dengan #3447

Saya akan menambahkan ke utas basi ini juga. Saya sedang dalam proses menerapkan toko NgRx di proyek Angular saya. AOT build meneriaki saya ketika saya mengekspor referensi const ke suatu fungsi ...

export const reducer = ( state = initialState, action: CurrentAction): CurrentState => {...}

Memberi saya kesalahan Function expressions are not supported in decorators in 'reducers' . Masalahnya datang karena aturan linting kami. Kami telah secara khusus mengaktifkan aturan only-arrow-functions di seluruh proyek... akan sangat bagus untuk menambahkan pencocokan pola pada pengecualian untuk mengatakan mengecualikan file *.reducer.ts sebagai contoh untuk aturan khusus ini tetapi izinkan untuk tetap utuh untuk setiap file lainnya.

Karena itu, menambahkan baris ini ke bagian atas file untuk setiap file peredam tidak praktis. Sepertinya ada cara yang lebih baik.

Necrobumping ini juga. Saya mencoba menambahkan tslint-microsoft-contrib ke proyek Vue dan sekumpulan aturannya mengebom file .vue; ini bisa menjadi solusi yang berguna untuk masalah seperti ini sebelum pembuat aturan menyelesaikan bug tersebut - jika mereka mau. Seperti berdiri menambahkan komentar untuk menonaktifkan sekelompok aturan ke dalam setiap file Vue yang saya tulis memang rumit. Masuk akal juga untuk sedikit kurang ketat dalam kode UI atau untuk menangani idiom kerangka kerja, misalnya penggunaan ekspor default

Apakah halaman ini membantu?
0 / 5 - 0 peringkat