Tslint: tanpa ketergantungan implisit: Mendukung pemetaan jalur

Dibuat pada 20 Okt 2017  ·  18Komentar  ·  Sumber: palantir/tslint

Laporan Bug

  • __TSLint versi__: 5.8.0
  • __TypeScript versi__: 2.7.0-dev.20171020
  • __Menjalankan TSLint melalui__: CLI

Kode TypeScript sedang dilinting

src/a.ts

import { x } from "foo";

jenis/foo.d.ts

export const x = 0;

tsconfig.json

{
    "compilerOptions": {
        "paths": {
            "*": "types/*"
        }
    }
}

dengan konfigurasi tslint.json :

{
    "rules": {
        "no-implicit-dependencies": true
    }
}

Perilaku sebenarnya

ERROR: /home/andy/sample/tslint/src/a.ts[1, 19]: Module 'foo' is not listed as dependency in package.json

Perilaku yang diharapkan

Tidak ada kesalahan. Saya pikir jika impor tidak diselesaikan untuk sesuatu di node_modules aturan ini harus mengabaikannya.

Komentar yang paling membantu

Aturan ini tidak berfungsi saat kita menggunakan alias untuk kode sumber kita sendiri (bukan untuk mengimpor dari paket npm). Sangat berguna untuk menggunakan jalur absolut daripada jalur relatif.
Di tsconfig.json kami, untuk aplikasi sudut, kami hanya menambahkan:

"compilerOptions": {
  ...
  "baseUrl": "./src",
  "paths": {
    "~/env": ["environments/environment"],
    "~/*": ["app/*"]
  }
}

Kemudian kita dapat melakukan impor seperti:

import {FooService} from '~/core';
import {Environment} from '~/env';

Mungkin kita harus membuka kembali masalah ini untuk menyelesaikan kasus ini (tidak perlu node_modules, cukup file tsconfig.json).
Saya menghargai aturan ini, jadi akan sangat disayangkan untuk menonaktifkannya.

Semua 18 komentar

Saya pikir jika impor tidak diselesaikan untuk sesuatu di node_modules aturan ini harus mengabaikannya.

Aturan tidak mencoba menyelesaikan modul. Itu berarti Anda harus menginstal semua dependensi, yang sebenarnya tidak mungkin dilakukan dengan peerDependencies dan optionalDependencies. Dengan implementasi saat ini, Anda dapat membuat klon baru tanpa menginstal apa pun. Saya rasa itulah yang dilakukan sebagian besar alat kualitas kode.

Seperti yang saya pahami pemetaan jalur, mereka hanya ada pada waktu kompilasi. Saat runtime Anda masih memerlukan modul yang diinstal untuk node / webpack / apa pun untuk mengambilnya dengan benar.
Itu berarti pemetaan jalur hanya relevan jika Anda hanya memiliki jenis impor yang dihilangkan selama kompilasi. Dalam hal ini aturan mungkin bukan pilihan yang tepat untuk Anda.

Dalam kasus kami umumnya tidak ada package.json sama sekali, jadi saya kira kita harus menonaktifkan aturan ini saja. Terima kasih!

Dalam kasus saya, saya "mengimpor" proyek TypeScript terpisah yang saya kerjakan secara bersamaan menggunakan pemetaan jalur:

"compilerOptions": {
    ...
    "paths": {
        "tsbase": ["../tsBaseProject/src"],
        "tslibrary": ["../tsProjectLibrary/src"]
    }
}

sehingga saya dapat menggunakannya dalam proyek seolah-olah itu adalah modul.
Apakah ada cara untuk memasukkan mereka ke daftar putih?

@marcoqu Pemetaan jalur hanya relevan pada waktu kompilasi. Saat runtime modul ini harus ada di node_modules. Saya sarankan menambahkannya sebagai dependencies atau peerDependencies ke package.json Anda

Ketika saya mengkompilasi sumber utama yang "mengimpor" proyek sekunder, semuanya dikompilasi menjadi satu bundel seolah-olah itu adalah folder sebenarnya dalam proyek. Saya tidak perlu memilikinya di folder node_modules.
Untuk lebih jelasnya, di folder proyek sekunder saya memiliki file .ts yang sebenarnya, tidak hanya deklarasi tipe.

+1 untuk menambahkan daftar putih seperti di no-submodule-imports

Kami juga memiliki kasus yang kami gunakan kasus yang kami definisikan alias jalur '~' ke direktori dasar untuk menghindari impor relatif. Alias ​​​​ini kemudian diselesaikan oleh webpack, fuse-box, dll. Dimulai dengan 5.8, tslint mengeluarkan banyak kesalahan palsu karena ini ...

Apa yang dia katakan ^^

Setelah memutakhirkan, saya sekarang memiliki ratusan kesalahan ini karena alasan yang sama seperti yang diuraikan di atas. Jenis aturan yang tidak berguna.

Aturan ini tidak berfungsi saat kita menggunakan alias untuk kode sumber kita sendiri (bukan untuk mengimpor dari paket npm). Sangat berguna untuk menggunakan jalur absolut daripada jalur relatif.
Di tsconfig.json kami, untuk aplikasi sudut, kami hanya menambahkan:

"compilerOptions": {
  ...
  "baseUrl": "./src",
  "paths": {
    "~/env": ["environments/environment"],
    "~/*": ["app/*"]
  }
}

Kemudian kita dapat melakukan impor seperti:

import {FooService} from '~/core';
import {Environment} from '~/env';

Mungkin kita harus membuka kembali masalah ini untuk menyelesaikan kasus ini (tidak perlu node_modules, cukup file tsconfig.json).
Saya menghargai aturan ini, jadi akan sangat disayangkan untuk menonaktifkannya.

@andy-ms harap pertimbangkan kembali jalur pendukung (kami menggunakannya secara ekstensif dengan ruang kerja nx). Ini adalah aturan yang sangat berguna, tetapi untuk saat ini saya terpaksa menonaktifkannya.

Saya mencoba mencari melalui kode sumber dan perbaikan perlu dilakukan di suatu tempat di sepanjang baris ini . Saya juga telah memeriksa bagaimana TypeScript menangani itu dan saya melacaknya ke fungsi ini . Jelas tidak mudah untuk menduplikasi logika itu. Saya tidak yakin apakah fungsi itu dapat digunakan kembali, ada banyak argumen yang saya tidak yakin.

Saya sangat ingin melihat ini diperbaiki juga. Pemetaan jalur adalah fitur yang sangat dihargai. Saya juga mencoba menggunakan modul tertaut sebagai solusi, tetapi itu juga tidak didukung.

Saya memang menemukan solusi yang memecahkan masalah untuk saya, tetapi itu tidak pasti untuk semua orang, atau itu dapat dipertahankan sama sekali. Bagaimanapun, solusinya adalah sebagai berikut:

Tambahkan paket palsu ke optionalDependencies dengan nama peta jalur dari tsconfig.json , dan instal dependensi menggunakan npm install --no-optional . Sayangnya ini tidak berfungsi dengan yarn --ignore-optional - gagal mencoba mengambil paket.

Jadi, dengan jalur di tsconfig.json terlihat seperti ini:

    "paths": {
        "~/*": ["src/*"],
        "some-path/*": ["whatever/*"]
    }

Dan opsional di package.json seperti ini:

    "optionalDependencies": {
        "~": "tslint-hack",
        "some-path": "tslint-hack"
    },

Seharusnya dimungkinkan untuk menginstal dependensi produksi dan pengembangan menggunakan npm install --no-optional . Ini jelas mengasumsikan Anda tidak memerlukan dependensi opsional yang diinstal. Juga layak disebutkan saya tidak membuatnya bekerja dengan @ sebagai nama paket.

Jika Anda memilih untuk menggunakan peretasan ini, mungkinkah bijaksana untuk menambahkan file .npmrc ke root proyek, dengan optional=false dikonfigurasi, sehingga Anda dapat kembali menjalankan npm install tanpa bendera --no-optional .

Solusi lain yang _seharusnya_ berfungsi adalah dengan benar-benar membuat paket dengan nama yang diinginkan dan memublikasikannya ke registri pribadi, menggunakan verdaccio atau yang serupa. Saya percaya dimungkinkan untuk mengonfigurasi pendaftar pribadi per modul menggunakan .npmrc atau .yarnrc , dan karenanya harus lebih baik dalam hal pemeliharaan. Tak satu pun dari ini diuji sekalipun.

Semoga ini bisa sedikit membantu bagi mereka yang ingin menggunakan aturan tslint ini dan mempertahankan resolusi modul mereka. Tapi itu bukan pengganti untuk perbaikan yang tepat..

Juga mengalami masalah ini, sehingga sonar salah menandai ini sebagai bau kode.

Saya pikir ini adalah permintaan yang valid karena tslint adalah tentang TypeScript dan path adalah pengaturan TypeScript yang valid (dan penting).

Bagaimana jika saya memiliki package.json di direktori yang berbeda dari tslint.json ?

- web
    - package.json
    - ClientApp
        - tslint.json

Saya sedang mengerjakan pengaturan serupa dan saya mendapatkan kesalahan di hampir semua file karena aturan ini. Ada solusi untuk ini?

Cara yang saya temukan untuk mengatasi masalah ini adalah menggunakan opsi konfigurasi berikut.

"no-implicit-dependencies": [true, ["src", "app", "~"]]

Ini membuat daftar putih jalur yang disediakan. Jelas, ini berarti duplikasi tetapi ini adalah perbaikan cepat jika Anda mencarinya.

Bagi kita yang menggunakan simbol @ sebagai awalan untuk jalur khusus, saya telah mengajukan PR untuk memperbaiki bug kecil dengan implementasi saat ini #4192

"no-implicit-dependencies": [true, ["@src", "@app", "~"]]

@ifiokjr Saya menggunakan @ sebagai alias src saya, jadi impor saya terlihat seperti @/components
Tidak dapat menetapkan @ sebagai jalur yang diabaikan karena mencoba mengimpor @/components sebagai keseluruhan modul alih-alih menyelesaikan @ terlebih dahulu.

Saya mengubah alias saya menjadi ~ dan menggunakan baris di atas di tslint saya, menyelesaikan masalah

Apakah halaman ini membantu?
0 / 5 - 0 peringkat