Tslint: interface-over-type-literal seharusnya tidak direkomendasikan

Dibuat pada 25 Sep 2017  ·  18Komentar  ·  Sumber: palantir/tslint

Ya, saya tahu dokumen TypeScript mengatakan

Karena properti perangkat lunak yang ideal terbuka untuk ekstensi, Anda harus selalu menggunakan antarmuka di atas alias tipe jika memungkinkan.

tetapi serius, jika saya membuat tipe sederhana tanpa niat untuk menggunakannya sebagai hal yang dapat diperpanjang, tidak masuk akal untuk mengkodekannya sebagai antarmuka.

API Breaking Change Enhancement

Komentar yang paling membantu

Saya tahu bahwa saya dapat menimpanya, tetapi saya merasa cukup yakin bahwa rekomendasi tersebut salah.

Inilah pandangan saya tentangnya. Ada banyak kasus di mana antarmuka tidak dapat digunakan untuk alias tipe. Anda hanya dapat menggunakan antarmuka untuk mengetik objek literal. Jika saya mengikuti praktik terbaik yang direkomendasikan, maka dalam file kelas tertentu di mana saya mungkin memiliki beberapa alias tipe, beberapa akan menjadi alias tipe dan beberapa akan menjadi antarmuka. Seseorang yang tersandung pada kelas ini akan bertanya-tanya apa yang sedang terjadi dan apakah saya bermaksud antarmuka untuk diimplementasikan/diperpanjang di suatu tempat, atau setidaknya mengharapkannya menjadi suatu kemungkinan.

Akan jauh lebih bersih menurut saya bagi saya untuk menggunakan alias tipe untuk alias tipe dan antarmuka untuk antarmuka, daripada mengganti satu dengan yang lain dalam beberapa kasus hanya karena antarmuka memiliki beberapa kemampuan tambahan (yang tidak saya perlukan jika semua ingin adalah tipe alias).

Saya kira saya harus menulis masalah terhadap dokumen TypeScript, yang akan saya lakukan, tetapi saya pikir beberapa penilaian teknik dapat diterapkan di sini daripada menerapkan aturan hanya karena dokumen mengatakan Anda harus melakukannya.

Semua 18 komentar

Maaf, saya tidak mengerti maksud Anda. Apakah ini permintaan fitur atau laporan bug?

Nilai default untuk interface-over-type-literal di recommended.ts adalah true. Saya percaya itu seharusnya salah. Tidak yakin apakah itu merupakan permintaan fitur atau bug :-)

Setelah semua preset yang direkomendasikan adalah berpendirian. Ini menggabungkan praktik terbaik dan saran seperti yang Anda posting di atas.
Saat memperluas prasetel, Anda dapat mengesampingkan rekomendasi dan menyetel konfigurasi sesuai kebutuhan Anda.

Bagaimanapun, menonaktifkan aturan akan menjadi perubahan yang melanggar. Jadi jangan berharap ada perubahan sebelum versi utama berikutnya.


Untuk memperjelas: interface-over-type-literal hanya mengeluh tentang jenis deklarasi alias.

type Foo = {foo: number}; // The rule disallows this
interface Foo {foo: number} // and fixes it to this

let obj: {foo: number}; // This is still allowed

Karena alias tipe dan antarmuka dapat digunakan (hampir) secara bergantian, saya tidak mengerti mengapa Anda lebih suka tipe alias.

Pada catatan terkait: antarmuka dulu di-cache sementara tipe anonim seperti alias tipe dihitung ulang untuk penggunaan yang pernah ada. Jadi menggunakan alias tipe dapat secara signifikan meningkatkan waktu kompilasi.
Kesenjangan kinerja itu akan hampir hilang dengan versi TypeScript berikutnya.

Saya tahu bahwa saya dapat menimpanya, tetapi saya merasa cukup yakin bahwa rekomendasi tersebut salah.

Inilah pandangan saya tentangnya. Ada banyak kasus di mana antarmuka tidak dapat digunakan untuk alias tipe. Anda hanya dapat menggunakan antarmuka untuk mengetik objek literal. Jika saya mengikuti praktik terbaik yang direkomendasikan, maka dalam file kelas tertentu di mana saya mungkin memiliki beberapa alias tipe, beberapa akan menjadi alias tipe dan beberapa akan menjadi antarmuka. Seseorang yang tersandung pada kelas ini akan bertanya-tanya apa yang sedang terjadi dan apakah saya bermaksud antarmuka untuk diimplementasikan/diperpanjang di suatu tempat, atau setidaknya mengharapkannya menjadi suatu kemungkinan.

Akan jauh lebih bersih menurut saya bagi saya untuk menggunakan alias tipe untuk alias tipe dan antarmuka untuk antarmuka, daripada mengganti satu dengan yang lain dalam beberapa kasus hanya karena antarmuka memiliki beberapa kemampuan tambahan (yang tidak saya perlukan jika semua ingin adalah tipe alias).

Saya kira saya harus menulis masalah terhadap dokumen TypeScript, yang akan saya lakukan, tetapi saya pikir beberapa penilaian teknik dapat diterapkan di sini daripada menerapkan aturan hanya karena dokumen mengatakan Anda harus melakukannya.

Penggunaan kata kunci antarmuka untuk struktur menurut saya benar-benar harus dihindari. Aturan ini justru sebaliknya, jadi tidak mungkin ini bisa dianggap sebagai praktik terbaik.

Ini adalah salah satu hal yang menurut saya salah ketik, ini membingungkan konsep antarmuka, yang semantiknya dalam semua bahasa typesafe lain yang saya gunakan, berarti "kumpulan metode/fungsi/hal yang dapat dipanggil", dengan tanda tangan objek/ jenis bebek. Penggunaan antarmuka harus lebih ketat, dan saya akan sangat menyambut aturan TSLint "interface-must-declare-only-functions", atau "interface-must-declare-at-least-one-function" yang kurang ketat.

Struktur murni harus dideklarasikan menggunakan operator tipe dan diperluas menggunakan operator &. Dan nama harus dimulai dengan "T" :-)

@navels Saya setuju dengan umpan balik Anda, saya pikir tslint:recommended harus menghapus konfigurasi aturan yang terlalu beropini ini sebagai perubahan yang melanggar di versi utama berikutnya

bagaimana saya bisa mengganti opsi ini?

@sibelius di tslint.json Anda, di bawah "rules" , tandai sebagai false :

{
    "extends": ["tslint:recommended"],
    "rules": {
        "interface-over-type-literal": false
    }
}

Perhatikan bahwa masalah ini melacak penonaktifan aturan di kumpulan aturan yang direkomendasikan. Jika Anda memiliki pertanyaan umum tentang TSLint, gunakan StackOverflow atau Gitter.

Di sini seseorang berbicara tentang subjek ini https://medium.com/@martin_hotell/interface -vs-type-alias-in-typescript-2-7-2a8f1777af4c

Tentang menimpa aturan, saya lebih suka opsi untuk memaksa saya menggunakan tipe daripada antarmuka atau bahkan lebih baik, memaksa saya untuk menggunakan tipe hanya jika saya mendefinisikan Props atau State dalam reaksi saya komponen.

Saya telah menulis kode OOP semakin sedikit sampai-sampai saya tidak menggunakannya sama sekali dalam proyek saya saat ini.
Saya tidak ingin pemula didorong ke arah itu.

@dandrei dan saya hanya menggunakan Antarmuka, ketika saya ingin menggambarkan fungsi (saya juga tidak menggunakan OOP).

Ya, yang ini pasti salah dan IMO seharusnya tidak menjadi bagian dari yang direkomendasikan, atau setidaknya tidak diperbaiki secara otomatis sehingga kami dapat menonaktifkannya sebelum merusak tipe kami.

Rekomendasi tersebut benar-benar memecahkan kode. Mempertimbangkan:

type Foo = {
  foo: string
}

interface IndexedObject {
  [key: string]: string
}

function useIndexedObject(object: IndexedObject) {}

const foo: Foo = {foo: "foo"}
useIndexedObject(foo)

Kode di atas berfungsi. Hingga tslint --fix diterapkan dan mengubah type Foo menjadi interface Foo , baris terakhir menghasilkan kesalahan:

Argument of type 'Foo' is not assignable to parameter of type 'IndexedObject'.
  Index signature is missing in type 'Foo'.

IMO, aturan apa pun yang melanggar kode tidak boleh menjadi rekomendasi. Heck, seharusnya tidak menjadi aturan jika berpotensi memecahkan kode.

Tidak hanya itu, tetapi juga menyebabkan aturan "antarmuka harus dimulai dengan 'saya'".

error TS2344: ...
Index Signature is missing in type 'SOME INTERFACE'.

jadi saya harus menggunakan type .

Jika aplikasi Anda memiliki banyak penggunaan type , ini merupakan indikator pelanggaran prinsip SOLID yang baik.

Menghapus label Type: Breaking Change per #4811. Sekarang menerima PR!

Jadi mengapa disebut TypeScript, padahal seharusnya dinamai InterfaceScript?! 🤣.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

DanielKucal picture DanielKucal  ·  3Komentar

Ne-Ne picture Ne-Ne  ·  3Komentar

cateyes99 picture cateyes99  ·  3Komentar

denkomanceski picture denkomanceski  ·  3Komentar

SwintDC picture SwintDC  ·  3Komentar