Di TypeScript, saya bisa mendeklarasikan parameter fungsi sebagai tipe Function. Apakah ada cara "aman untuk" melakukan hal ini yang saya lewatkan? Sebagai contoh, pertimbangkan ini:
class Foo {
save(callback: Function) : void {
//Do the save
var result : number = 42; //We get a number from the save operation
//Can I at compile-time ensure the callback accepts a single parameter of type number somehow?
callback(result);
}
}
var foo = new Foo();
var callback = (result: string) : void => {
alert(result);
}
foo.save(callback);
Simpan callback bukan tipe aman, saya memberinya fungsi callback di mana parameter fungsi adalah string tetapi saya meneruskannya nomor, dan mengkompilasi tanpa kesalahan. Bisakah saya membuat parameter hasil dalam menyimpan fungsi tipe-aman?
TL; Versi DR: apakah ada yang setara dengan delegasi .NET di TypeScript?
typescript
vcsjones
sumber
sumber
(n: number) => any
berarti ada tanda tangan fungsi?number
) tetapi tipe kembali tidak dibatasi sama sekali (bisa berupa nilai apa pun, atau bahkanvoid
)n
sintaks ini? Bukankah tipe input dan output saja sudah cukup?Berikut ini adalah setara dengan TypeScript dari beberapa delegasi .NET umum:
sumber
Action
danFunc
keduanya meniadakan sebagian besar kebutuhan untuk tipe delegasi tertentu dan, yang menarik, memberikan C # kemiripan pengetikan struktural. Kelemahan dari delegasi ini adalah bahwa nama mereka tidak memiliki arti tetapi keuntungan lain biasanya lebih besar dari ini. Dalam TypeScript kita tidak perlu tipe ini. Jadi anti-polanya adalahfunction map<T, U>(xs: T[], f: Func<T, U>)
. Lebih sukafunction map<T, U>(xs: T[], f: (x: T) => U)
Saya menyadari posting ini sudah tua, tetapi ada pendekatan yang lebih kompak yang sedikit berbeda dari yang diminta, tetapi mungkin merupakan alternatif yang sangat membantu. Anda pada dasarnya dapat mendeklarasikan fungsi in-line saat memanggil metode (
Foo
'ssave()
dalam kasus ini). Akan terlihat seperti ini:The
multipleCallback()
Pendekatan ini sangat berguna untuk hal-hal seperti panggilan jaringan yang mungkin berhasil atau gagal. Sekali lagi dengan asumsi contoh panggilan jaringan, kapanmultipleCallbacks()
dipanggil, perilaku untuk sukses dan gagal dapat didefinisikan di satu tempat, yang cocok untuk kejelasan yang lebih besar bagi pembaca kode masa depan.Secara umum, dalam pengalaman saya, pendekatan ini cocok untuk menjadi lebih ringkas, kurang berantakan, dan lebih jelas secara keseluruhan.
Semoga beruntung semuanya!
sumber
Ini tentunya sejalan dengan paradigma pemrograman fungsional.
sumber
inputType
bukanreturnType
, bukan? Di manainputType
jenisdata
yang Anda berikan parameter kecallback
fungsi.Di TS kita bisa mengetikkan fungsi-fungsi di dalam tata cara berikut:
Jenis fungsi / tanda tangan
Ini digunakan untuk implementasi nyata dari fungsi / metode yang memiliki sintaksis berikut:
Contoh:
Tipe Fungsi Literal
Literal tipe fungsi adalah cara lain untuk mendeklarasikan tipe fungsi. Mereka biasanya diterapkan dalam tanda tangan fungsi dari fungsi tingkat tinggi. Fungsi tingkat tinggi adalah fungsi yang menerima fungsi sebagai parameter atau yang mengembalikan fungsi. Ini memiliki sintaks berikut:
Contoh:
sumber
Jika Anda menentukan jenis fungsi terlebih dahulu maka akan terlihat seperti
Tanpa tipe fungsi dengan menggunakan sintaks properti biasa akan menjadi:
Jika Anda ingin menggunakan fungsi antarmuka seperti delegasi c # generiknya adalah:
sumber
Selain apa yang dikatakan orang lain, masalah umum adalah mendeklarasikan jenis fungsi yang sama yang kelebihan beban. Kasus umum adalah metode EventEmitter on () yang akan menerima beberapa jenis pendengar. Serupa bisa terjadi Ketika bekerja dengan aksi redux - dan di sana Anda menggunakan tipe tindakan sebagai literal untuk menandai kelebihan beban, Jika CaseEmitters, Anda menggunakan tipe literal nama acara:
sumber