Membuat penekanan kesalahan Arus lebih spesifik

Mar 19 2020
Kami meningkatkan penekanan kesalahan Arus sehingga mereka tidak menyembunyikan kesalahan secara tidak sengaja. Selama tahun mendatang, Flow berencana membuat banyak perubahan dan perbaikan pada sistem tipenya.
Foto oleh icon0.com dari Pexels

Kami meningkatkan penekanan kesalahan Arus sehingga mereka tidak menyembunyikan kesalahan secara tidak sengaja.

Selama tahun mendatang, Flow berencana membuat banyak perubahan dan perbaikan pada sistem tipenya . Namun, salah satu konsekuensi dari ini adalah Anda mungkin perlu menambahkan lebih banyak penekanan ke kode Anda karena Flow menjadi lebih baik dalam menemukan masalah yang ada.

Ini bisa menjadi masalah karena penekanan Flow memengaruhi lebih dari sekadar kesalahan asli yang ingin Anda tekan. Ini mengurangi kemampuan Flow untuk menangkap kesalahan. Ini adalah hasil dari dua properti: Pertama, bahwa penekanan aliran dapat ditempatkan di bagian mana pun dari kesalahan jenis, dan kedua, penekanan aliran dapat menekan semua jenis kesalahan jenis . Untuk memperbaiki kekurangan ini, kami akan meminta penekanan ditempatkan di lokasi dalam kode Anda di mana kesalahan sebenarnya terjadi, dan bahwa mereka menyertakan kode kesalahan yang menentukan jenis kesalahan yang ingin Anda sembunyikan.

Untuk memahami apa arti semua ini, mari kita gali sifat kesalahan tipe Flow.

Apa itu tipe kesalahan?

Ketika Flow mengalami masalah saat memeriksa kode Anda, seperti ketidakcocokan antara dua jenis atau akses properti yang tidak valid, Flow menghasilkan kesalahan yang melaporkan kepada pengguna secara tepat apa yang salah dengan kode mereka. Kesalahan ini dapat berisi berbagai macam informasi tergantung pada keadaan tertentu yang menyebabkannya, tetapi dua yang paling kami pedulikan adalah jenis kesalahan dan lokasi kesalahan.

The jenis kesalahan mengkodekan sifat spesifik dari perilaku buruk yang Arus terdeteksi dalam kode Anda, apakah itu sesuatu yang sederhana seperti melewati terlalu banyak argumen untuk fungsi, atau sesuatu yang kompleks seperti menyebarkan jenis serikat. Informasi ini memberi tahu Flow dengan tepat jenis informasi apa yang harus ditampilkan kepada pengguna untuk menjelaskan dengan tepat di mana kesalahan Anda.

The lokasi kesalahan berisi informasi tentang di mana kesalahan terletak di kode Anda. Ada dua jenis lokasi yang dapat berisi kesalahan, lokasi utama (yang hanya boleh ada satu), dan lokasi sekunder , yang bisa ada banyak atau tidak sama sekali. Lokasi utama kira-kira sesuai dengan lokasi di kode Anda tempat kesalahan sebenarnya terjadi, sedangkan lokasi sekunder membawa informasi tentang situs definisi dari jenis dan nilai yang terlibat dalam kesalahan. Sebagai contoh:

function foo(x : number) : void {}
foo("hello");
/* error */
foo("hello");
       ^ Cannot call `foo` with `"hello"` bound to `x` because string [1] is incompatible with number [2].
References:
2: foo("hello");
       ^ [1]
1: function foo(x : number) : void {}
                    ^ [2]

function foo(x : number) : void {}
let y : string = "hello";
foo(y);
/* error */
foo(y);
       ^ Cannot call `foo` with `y` bound to `x` because string [1] is incompatible with number [2].
References:
2: let y : string = "hello";
           ^ [1]
1: function foo(x : number) : void {}
                    ^ [2]

Jadi, apa yang salah dengan penindasan?

Nah, karena penekanan dapat diterapkan pada lokasi primer dan sekunder, memberi //$FlowFixMekomentar di atas definisi fooakan menekan kesalahan pada kedua contoh di atas. Karena foomuncul sebagai lokasi sekunder di setiap kesalahan yang menggunakannya, itu berarti bahwa penggunaan apa pun fooyang menghasilkan kesalahan akan disembunyikan oleh penindasan yang satu ini, di mana pun itu mungkin terjadi. Anda akan dapat memanggil foodengan sejumlah argumen jenis apa pun dan Flow tidak akan memunculkan kesalahan atau peringatan apa pun kepada Anda tentang semua ini. Ini menurunkan kepercayaan pengguna dalam pemeriksaan jenis Flow dan memungkinkan bug yang akan ditangkap untuk membuatnya ke produksi.

Selain itu, penindasan Flow memengaruhi semua jenis kesalahan, selama mengandung lokasi yang dicakup oleh penindasan. Ini berarti bahwa beberapa kesalahan dari jenis yang berbeda dapat diredam dengan satu penekanan. Untuk melihat bahayanya, perhatikan contoh berikut:

// library file lib.js
function foo(x : number) : void {}
// impl file
const {foo} = require("lib.js");
let y : string = "hello";
// $FlowFixMe
foo(y);

Apa yang akan kita lakukan tentang ini?

Untuk mengatasi ini, kami akan membuat perubahan berikut:

  • Terapkan lokasi utama. Kami akan mengubah perilaku penindasan sehingga penindasan hanya berlaku untuk error jika ditempatkan di lokasi utamanya. Misalnya, alih-alih mengizinkan Anda untuk menyembunyikan panggilan yang tidak valid pada definisi fungsi, sekarang kami akan meminta agar penekanan ditempatkan di situs panggilan itu sendiri. Dengan cara ini, Flow masih dapat mengingatkan Anda tentang panggilan lain yang mungkin tidak valid ke fungsi tersebut.
  • Tambahkan kode kesalahan. Kami juga akan menambahkan kode kesalahan ke penindasan kami sehingga kode tersebut hanya menyembunyikan kesalahan dari jenis yang ditentukan. Ini akan mencegah penindasan dari secara tidak terduga menekan jenis kesalahan yang tidak Anda duga akan terjadi.
  • Standarisasi sintaks penekanan. Sebelumnya, sintaks yang dapat diterima untuk penindasan kesalahan dapat dikonfigurasi secara manual di .flowconfiguntuk proyek tertentu, yang memungkinkan sintaks penindasan yang tidak konsisten di seluruh proyek. Sebagai bagian dari perubahan di atas, kami juga akan menstandarkan sintaks penekanan; hanya mendukung format $FlowFixMe[incompatible-type]atau $FlowExpectedError[incompatible-type].

Mulai tersedia

Kami menyadari bahwa perubahan ini dapat menyebabkan sejumlah besar kesalahan dalam basis kode Anda menjadi tidak valid, terutama jika Anda terbiasa menempatkan penekanan dalam kode perpustakaan. Untuk meringankan beban ini, kami memiliki beberapa saran:

  • Untuk memindahkan penekanan baru yang tidak valid ke lokasi utamanya, kami merekomendasikan kombinasi dari add-commentsdan remove-commentsutilitas yang disediakan dalam alat Flow. Berjalan ./tool remove-commentsakan menghapus setiap komentar yang tidak lagi menyembunyikan kesalahan karena tidak berada di lokasi utama, dan ./tool add-commentsakan menempatkan penekanan baru pada lokasi yang tidak ditekan. The ./toolScript dapat diakses oleh kloning repositori Arus di GitHub.
  • Penekanan tanpa kode kesalahan akan terus menyembunyikan setiap dan semua kesalahan di lokasinya, tetapi setelah kami meluncurkan fitur kode kesalahan, Anda dapat menambahkan kode yang tepat ke basis kode Anda melalui proses yang sama seperti di atas. Menghapus semua komentar lama Anda dan menambahkannya kembali dengan add-commentsakan menyertakan kode kesalahan dalam komentar yang baru ditambahkan.