Rumah > hujung hadapan web > tutorial js > Fungsi Anotasi dalam Typescript

Fungsi Anotasi dalam Typescript

Barbara Streisand
Lepaskan: 2024-12-23 12:27:35
asal
542 orang telah melayarinya

Annotating Functions in Typescript

Cara paling asas untuk menganotasi fungsi dalam skrip taip adalah seperti ini

function add(a: number, b: number): number{
 // logic
}

// or

const add = (a: number, b: number): number => {
    //logic
}
Salin selepas log masuk
Salin selepas log masuk

parameter pilihan dianotasi dengan param tanda soal? begini

function optional(a: number, b?: number){
    console.log(a)
}
Salin selepas log masuk
Salin selepas log masuk

Tetapi bagaimana pula dengan fungsi panggil balik, atau fungsi yang jenis hujah dan jenis pulangan berkaitan (dalam kes itu, generik).


Nilai Fungsi

Perhatikan fungsi JavaScript ini

function multiplier(factor){
    return value => factor * value
}
Salin selepas log masuk
Salin selepas log masuk

supaya kita boleh menggunakan fungsi seperti ini;

const n  = multiplier(6)
n(8) // 48
Salin selepas log masuk
Salin selepas log masuk

Nilai fungsi dianotasi dalam skrip taip seperti ini

(param1: type, param2: type)=> type

// or

const add: (a: number, b: number)=> number = function (a, b){
    return a + b
}
Salin selepas log masuk

Jadi untuk menganotasi fungsi pengganda, kami mempunyai

function multiplier(factor: number): (value: number) => number{
    return value => factor * value
}
Salin selepas log masuk

IDE anda (sebaik-baiknya) VSCode, secara automatik akan membuat kesimpulan jenis nilai (menjadi nombor) dalam logik fungsi


Fungsi generik

Anotasi fungsi ini salah

function pickFirst(array: Array<T>): T{
    return array[0]
}
Salin selepas log masuk

Sememangnya ini menimbulkan ralat yang
Tidak dapat mencari nama T

oleh itu, format menganotasi fungsi generik ialah

function fnName <T,U>(param: T): U{
    //logic
}
Salin selepas log masuk

Perhatikan di mana nama generik diisytiharkan. jadi, untuk menganotasi fungsi di atas dengan betul;

function pickFirst<T>(array: Array<T>): T{
    return array[0]
}
Salin selepas log masuk

Sekarang berjaya.

Tetapi bagaimana pula dengan fungsi Generik yang mempunyai parameter fungsi.

Sebagai contoh, kami ingin menganotasi fungsi peta tersuai bernama myMap yang ditulis seperti ini dalam Javascript

function myMap(arr, fn){
    rreturn arr.map(fn)
}
Salin selepas log masuk

Kita boleh membuat anotasi seperti ini

function myMap<Input, Output>(arr: Input[], fn: (item: Input, index?: number) => Output): Output[]{
    return arr.map(fn)
}
Salin selepas log masuk

Apa yang perlu kita perhatikan dalam coretan di atas ialah fungsi fn mengambil item daripada jenis tatasusunan Input yang sama dan mengembalikan jenis Output.

Bagaimana pula dengan kaedah Array.from() statik?

function myFrom<Type>(iterable: Iterable<Type>): Array<Type>{
    // logic
}
Salin selepas log masuk

atau kaedah array.filter()?

function myFilter<Input>(arr: Input[], fn: (item: Input) => boolean): Input[]{
    return arr.filter(fn)
}
Salin selepas log masuk

Kekangan generik

Anda juga boleh mengekang pembolehubah generik kepada jenis yang mempunyai sifat tertentu. Contohnya,

function pickInnerFirst<T extends {length: number}>(array: Array<T>): T{
    return array[0][0]
}
Salin selepas log masuk

Fungsi ini memilih elemen pertama dalam tatasusunan 2 dimensi

Ini memastikan bahawa ia hanya berfungsi untuk tatasusunan dan rentetan (kebanyakannya) dengan cara yang

pickOne([12, 20, 30]) // wont work.
Salin selepas log masuk

Kami juga boleh menggunakan antara muka

interface Lengthly{
    length: number;
}

function pickInnerFirst<T extends Lengthly>(array: Array<T>): T{
    return array[0][0]
}
Salin selepas log masuk

Antara Muka Fungsi

Sekiranya anda tidak tahu, Fungsi ialah objek dan ia mempunyai sifat

const add = (a, b) => a + b

console.log(add.toString()) //(a, b) => a + b

// also
console.log(Object.getPrototypeOf(add) == Function.prototype) //true
console.log(Object.getPrototypeOf(Function.prototype) == Object.prototype) //true
Salin selepas log masuk

Contoh kedua menunjukkan bahawa fungsi tambah ialah anak Object.prototype (walaupun ia bukan anak langsung) dan oleh itu ialah objek.

Cukup lucu, anda boleh melampirkan sifat pada fungsi dalam JavaScript

function add(a: number, b: number): number{
 // logic
}

// or

const add = (a: number, b: number): number => {
    //logic
}
Salin selepas log masuk
Salin selepas log masuk

Coretan ini akan kembali

function optional(a: number, b?: number){
    console.log(a)
}
Salin selepas log masuk
Salin selepas log masuk

Perhatikan bahawa di A kami melampirkan sifat yang dipanggil perihalan pada fungsi yang hanya boleh dilakukan dengan objek.

Itu untuk membuat kesimpulan bahawa;

Objek boleh diterangkan dengan antara muka (biasanya). Untuk fungsi, ini juga mungkin. walau bagaimanapun, ia hanya sesuatu yang perlu anda pertimbangkan apabila anda menambah sifat istimewa pada fungsi anda.

function multiplier(factor){
    return value => factor * value
}
Salin selepas log masuk
Salin selepas log masuk

Pada ulasan A ialah tempat kami menerangkan hujah dan jenis pengembalian fungsi.

Jadi, untuk menganotasi kod terdahulu dalam skrip taip,

const n  = multiplier(6)
n(8) // 48
Salin selepas log masuk
Salin selepas log masuk

Perhatikan cara kami menggunakan antara muka dalam fungsi jeritan di A.


Mengapakah saya perlu memahami cara menganotasi fungsi dalam Typescript?

Nah, ia membantu dalam membina sistem jenis yang jauh lebih pintar yang seterusnya mengurangkan peluang anda dijangkiti pepijat. Jika anda sedang membina perpustakaan atau rangka kerja, anda mungkin perlu menggunakan beberapa atau kebanyakan konsep yang dinyatakan di sini.
Jika anda hanya menggunakan perpustakaan, konsep ini sebenarnya tidak diperlukan, walaupun ia boleh memberi anda pemahaman yang lebih mendalam tentang perpustakaan yang anda bekerjasama.

Sekiranya anda mempunyai sebarang soalan atau terdapat kesilapan dalam penulisan ini, sila kongsikan di ruangan komen di bawah ⭐

Atas ialah kandungan terperinci Fungsi Anotasi dalam Typescript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan