Məzmuna keç
Educora
Başlanğıc15 dəq3 / 8

Tipli funksiyalar

Funksiyaların parametrlərinə və qaytardığı qiymətə tip yaz, qeyri-məcburi, susmaya görə və rest parametrlərdən istifadə et, funksiya tiplərini təsvir et.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Parametrlərə və qaytarılan qiymətə tip yazmaq
  • Qeyri-məcburi, susmaya görə və rest parametrlərdən istifadə etmək
  • (a: number) => number kimi funksiya tipləri yazmaq və kontekstdən tip çıxarışını başa düşmək
  • void və never tiplərinin mənasını bilmək

Funksiya bir növ müqavilədir: nə qəbul edir və nə qaytarır. JavaScript-də bu müqavilə yalnız proqramçının yaddaşında və ya şərhlərdə yaşayır, şərhlər isə tez köhnəlir. TypeScript-də müqavilə funksiyanın başlığında yazılır və kompilyator ona hər çağırışda əməl olunduğunu yoxlayır — həm funksiyanı yazanda, həm də ondan istifadə edəndə.

Parametrlər və qaytarılan qiymət

Hər parametrin tipi adından sonra iki nöqtə ilə yazılır. Qaytarılan qiymətin tipi isə mötərizədən sonra gəlir. Aşağıdakı funksiya restoranda çaypulunu hesablayır:

TypeScript
function calculateTip(bill: number, percent: number): number {
  return (bill * percent) / 100;
}

const tip = calculateTip(40, 15);
console.log(`Tip: ${tip} AZN`);
Gözlənilən nəticə
Tip: 6 AZN

Kompilyator müqavilənin hər iki tərəfini yoxlayır. Çağıran tərəf bütün arqumentləri düzgün tiplə verməlidir, funksiyanın gövdəsi isə vəd etdiyi tipi qaytarmalıdır:

TypeScript
function calculateTip(bill: number, percent: number): number {
  return (bill * percent) / 100;
}

calculateTip(40);

function isAdult(age: number): boolean {
  if (age >= 18) {
    return 'yes';
  }
  return false;
}
Text
tip.ts:5:1 - error TS2554: Expected 2 arguments, but got 1.

5 calculateTip(40);
  ~~~~~~~~~~~~

  tip.ts:1:37
    1 function calculateTip(bill: number, percent: number): number {
                                          ~~~~~~~~~~~~~~~
    An argument for 'percent' was not provided.

tip.ts:9:5 - error TS2322: Type 'string' is not assignable to type 'boolean'.

9     return 'yes';
      ~~~~~~
Birinci səhv çağıranın, ikincisi funksiyanın öz səhvidir. Kompilyator hətta hansı arqumentin unudulduğunu da deyir.

Qeyri-məcburi, susmaya görə və rest parametrlər

  • Qeyri-məcburi parametr adından sonra ? ilə yazılır: greeting?: string. Onun tipi əslində string | undefined-dır, yəni verilməyə də bilər.
  • Susmaya görə qiyməti olan parametr (currency = 'AZN') tipini həmin qiymətdən alır — burada string. Arqument verilməsə, bu qiymət işlədilir.
  • Rest parametr (...numbers: number[]) istənilən sayda arqumenti massivə yığır.
  • Qeyri-məcburi parametrlər məcburi parametrlərdən sonra gəlməlidir.
TypeScript
function greet(name: string, greeting?: string): string {
  return `${greeting ?? 'Hello'}, ${name}!`;
}

function price(amount: number, currency = 'AZN'): string {
  return `${amount.toFixed(2)} ${currency}`;
}

function sum(...numbers: number[]): number {
  return numbers.reduce((total, n) => total + n, 0);
}

console.log(greet('Murad'));
console.log(greet('Murad', 'Salam'));
console.log(price(12.5), '|', price(12.5, 'USD'));
console.log(sum(1, 2, 3), sum());
Gözlənilən nəticə
Hello, Murad!
Salam, Murad!
12.50 AZN | 12.50 USD
6 0
?? operatoru greeting verilməyəndə 'Hello' qiymətini götürür.

Qeyri-məcburi parametr undefined ola bildiyi üçün TypeScript onu yoxlamadan istifadə etməyə icazə vermir. greet funksiyasında biz ?? ilə ehtiyat qiymət vermişdik; bunu unutsaq, belə olar:

TypeScript
function shout(name: string, greeting?: string): string {
  return `${greeting.toUpperCase()}, ${name}!`;
}
Text
shout.ts:2:13 - error TS18048: 'greeting' is possibly 'undefined'.

2   return `${greeting.toUpperCase()}, ${name}!`;
              ~~~~~~~~

Funksiya tipləri

JavaScript-də funksiyalar adi qiymətlərdir: onları dəyişənə yazmaq və başqa funksiyaya arqument kimi ötürmək olar. Deməli, funksiyanın da tipi var. Funksiya tipi ox sintaksisi ilə yazılır: (a: number, b: number) => number — «iki ədəd qəbul edən və ədəd qaytaran funksiya». Belə tipə type ilə ad vermək rahatdır.

TypeScript
type Operation = (a: number, b: number) => number;

const add: Operation = (a, b) => a + b;
const multiply: Operation = (a, b) => a * b;

function calculate(x: number, y: number, op: Operation): number {
  return op(x, y);
}

console.log(calculate(6, 7, add));
console.log(calculate(6, 7, multiply));
console.log([1, 2, 3].map((n) => n * 10));
Gözlənilən nəticə
13
42
[ 10, 20, 30 ]

Diqqət et: add funksiyasında a və b üçün tip yazmamışıq, amma səhv də yoxdur. Bu, kontekstdən tip çıxarışıdır (contextual typing): funksiya Operation tipli dəyişənə yazıldığı üçün TypeScript parametrlərin number olduğunu bilir. map üçün də eynidir: massiv ədədlərdən ibarət olduğundan n avtomatik number olur.

TipMənasıNümunə
voidfunksiya faydalı heç nə qaytarmırfunction log(msg: string): void
neverfunksiya heç vaxt normal başa çatmır — məsələn, həmişə xəta atırfunction fail(msg: string): never
funksiya tipiparametrlər və qaytarılan tip(a: number, b: number) => number

Əsas fikirlər

  • Parametrlərin tipi adlarından sonra, qaytarılan tip isə mötərizədən sonra yazılır.
  • Kompilyator arqumentlərin sayını və tipini, gövdədə isə qaytarılan qiyməti yoxlayır.
  • x?: T qeyri-məcburidir və T | undefined tiplidir; x = qiymət susmaya görə qiymətdir; ...xs: T[] rest parametrdir.
  • Funksiya tipi ox ilə yazılır: (a: number, b: number) => number; kontekstdən tip çıxarışı parametrlərin tipini özü tapır.
  • void — heç nə qaytarmır, never — heç vaxt normal başa çatmır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
(a: number, b: number) => number tipi nəyi təsvir edir?