Begränsningar av generics i TypeScript

I en av de tidigare lektionerna skapade vi en funktion av generisk typ som skulle skriva ut längden på parametern som skickades till den. Men vid kompilering fick vi ett fel, eftersom inte alla typer kan ha en längd:

typescriptfunction myFunc < T > (data: T): T {
  console.log(data.length); // fel
  return data;
}

I det fallet löste vi situationen genom att ändra den generiska typen till en typ av generisk array. Men i TypeScript finns det en möjlighet att skapa begränsningar för generics. För att göra detta skriver vi, i vinkelparenteserna, efter variabeln T, nyckelordet extends. Efter det skriver vi inom klammerparenteser en ny variabel str av strängtyp. Resten av funktionskoden förblir oförändrad:

typescriptfunction myFunc <T extends {str: string}> (data: T): void {
  console.log(data.str.length);
}

Det visar sig att den generiska typen ärver typen av variabeln str, specificerad i klammerparenteserna. Låt oss nu kontrollera vår funktions arbete och skapa en variabel myStr, som refererar till typen str, och tilldela den ett värde inom klammerparenteser:

typescriptlet myStr: {str: string} = {str: 'abcde'};

Låt oss anropa funktionen myFunc, utan att glömma att återigen specificera dess typ och skicka variabeln myStr som en parameter:

typescriptmyFunc <{str: string}> (myStr);
Задание 1

Baserat på exemplet som granskades i lektionen, skapa en funktion för att hitta längden av en numerisk array.