Bagian 6.3 dari spesifikasi bahasa TypeScript berbicara tentang fungsi yang berlebihan dan memberikan contoh nyata tentang bagaimana mengimplementasikan ini. Namun jika saya mencoba sesuatu seperti ini:
export class LayerFactory {
constructor (public styleFactory: Symbology.StyleFactory) { }
createFeatureLayer (userContext : Model.UserContext, mapWrapperObj : MapWrapperBase) : any {
throw "not implemented";
}
createFeatureLayer(layerName : string, style : any) : any {
throw "not implemented";
}
}
Saya mendapatkan kesalahan kompiler yang menunjukkan pengidentifikasi duplikat meskipun parameter fungsi dari tipe yang berbeda. Bahkan jika saya menambahkan parameter tambahan ke fungsi createFeatureLayer kedua, saya masih mendapatkan kesalahan kompiler. Gagasan, silakan.
typescript
overloading
Klaus Nji
sumber
sumber
Jawaban:
Ini mungkin karena, ketika kedua fungsi dikompilasi dengan JavaScript, tanda tangannya sama sekali identik. Karena JavaScript tidak memiliki jenis, kami akhirnya membuat dua fungsi dengan jumlah argumen yang sama. Jadi, TypeScript membatasi kita dari membuat fungsi-fungsi seperti itu.
TypeScript mendukung overloading berdasarkan jumlah parameter, tetapi langkah-langkah yang harus diikuti sedikit berbeda jika kita dibandingkan dengan bahasa OO. Dalam menjawab pertanyaan SO lainnya, seseorang menjelaskannya dengan contoh yang bagus: Metode overloading? .
Pada dasarnya, apa yang kita lakukan adalah, kita hanya menciptakan satu fungsi dan sejumlah deklarasi sehingga TypeScript tidak memberikan kesalahan kompilasi. Ketika kode ini dikompilasi ke JavaScript, fungsi konkret saja akan terlihat. Sebagai fungsi JavaScript dapat dipanggil dengan melewati beberapa argumen, itu hanya berfungsi.
sumber
type
s, enum, generik, dll, hilang saat runtime. Itu juga sebabnya Anda tidak bisa melakukannyasomeObject instanceof ISomeInterfaceDefinedInTypeScript
.Ketika Anda kelebihan dalam TypeScript, Anda hanya memiliki satu implementasi dengan beberapa tanda tangan.
Hanya tiga kelebihan yang dikenali oleh TypeScript sebagai tanda tangan yang mungkin untuk pemanggilan metode, bukan implementasi yang sebenarnya.
Dalam kasus Anda, saya secara pribadi akan menggunakan dua metode dengan nama yang berbeda karena tidak ada cukup kesamaan dalam parameter, yang memungkinkan badan metode perlu memiliki banyak "seandainya" untuk memutuskan apa yang harus dilakukan.
TypeScript 1.4
Pada TypeScript 1.4, Anda biasanya dapat menghapus kebutuhan untuk kelebihan menggunakan tipe serikat. Contoh di atas dapat diekspresikan lebih baik menggunakan:
Jenisnya
a
adalah "salahstring
ataunumber
".sumber
class Foo { constructor(obj) { } constructor (a: number, b: string, c: boolean) {} }
Foo.fromObject(obj)
danFoo.fromJson(str)
dan sebagainya.Foo.methos(1, 2, 3)
Foo.method(1)
Foo.method(Obj)
Saya juga memperhatikan Anda memiliki metode yang berbeda diFoo
Kelas, fromObject dan fromJson?myNum
ataumyObj
tetap, jadi mengapa tidak memiliki metode terpisah dan membuat semuanya jelas / hindari logika percabangan yang tidak perlu.Anda dapat mendeklarasikan fungsi kelebihan beban dengan mendeklarasikan fungsi tersebut memiliki tipe yang memiliki banyak tanda tangan permohonan:
Maka berikut ini:
Definisi aktual dari fungsi harus tunggal dan melakukan pengiriman yang tepat secara internal pada argumennya.
Misalnya, menggunakan kelas (yang bisa mengimplementasikan
IFoo
, tetapi tidak harus):Yang menarik di sini adalah bahwa
any
formulir disembunyikan oleh penimpaan diketik lebih spesifik.sumber
Apakah fungsi kelebihan beban secara umum?
Apakah fungsi kelebihan beban di JS?
Fitur ini tidak dimungkinkan dalam JS - fungsi yang didefinisikan terakhir diambil jika ada beberapa deklarasi:
... dan di TS?
Overload adalah konstruk waktu kompilasi tanpa dampak pada runtime JS:
Kesalahan implementasi duplikat dipicu, jika Anda menggunakan kode di atas (lebih aman daripada JS). TS memilih overload fitting pertama dalam urutan top-down, sehingga overload diurutkan dari yang paling spesifik ke yang paling luas.
Metode overloading di TS: contoh yang lebih kompleks
Tipe metode kelas kelebihan beban dapat digunakan dengan cara yang mirip dengan fungsi kelebihan beban:
Overload yang sangat berbeda dimungkinkan, karena implementasi fungsi kompatibel untuk semua tanda tangan overload - diberlakukan oleh kompiler.
Lebih banyak info:
sumber
Sebagai kepala ke orang lain, saya telah menyadari bahwa setidaknya sebagaimana dimanifestasikan oleh TypeScript dikompilasi oleh WebPack untuk Angular 2, Anda diam-diam mendapatkan overWRITTEN alih-alih metode overLOADED.
Panggilan:
tampaknya mengeksekusi metode dengan argumen, dengan diam-diam mengabaikan versi no-arg, dengan output:
sumber
Duplicate function implementation
peringatan untuk kode seperti ini.Fungsi overload dalam naskah:
Menurut Wikipedia, (dan banyak buku pemrograman) definisi overloading metode / fungsi adalah sebagai berikut:
Dalam naskah, kita tidak bisa memiliki implementasi yang berbeda dari fungsi yang sama yang dipanggil sesuai dengan jumlah dan jenis argumen. Ini karena ketika TS dikompilasi ke JS, fungsi-fungsi di JS memiliki karakteristik berikut:
Oleh karena itu, dalam arti yang ketat, orang dapat berargumen bahwa kelebihan fungsi TS tidak ada. Namun, ada beberapa hal yang dapat Anda lakukan dalam kode TS Anda yang dapat dengan sempurna meniru fungsi yang berlebihan.
Berikut ini sebuah contoh:
TS docs menyebut metode ini kelebihan beban, dan yang pada dasarnya kami lakukan adalah memasok beberapa tanda tangan metode (deskripsi parameter dan tipe yang mungkin) ke kompiler TS. Sekarang TS dapat mengetahui apakah kita memanggil fungsi kita dengan benar selama waktu kompilasi dan memberi kita kesalahan jika kita menyebut fungsi tersebut dengan tidak benar.
sumber