BaliseTonSite

Fonctions & Typage

Des fonctions solides comme un roc.

3.1Typer les paramètres et le retour

TypeScripttypescript
// Paramètres typés + retour typé
function additionner(a: number, b: number): number {
  return a + b
}

additionner(5, 3)        // ✅ 8
// additionner("5", 3)   // ❌ Le premier argument doit être un number

// Arrow function typée
const multiplier = (a: number, b: number): number => a * b

// Le retour est souvent inféré, mais l'annoter est une bonne pratique
function saluer(nom: string) {  // retour inféré : string
  return `Bonjour ${nom}`
}

3.2Paramètres optionnels et par défaut

TypeScripttypescript
// Paramètre optionnel avec "?"
function creerProfil(nom: string, bio?: string): string {
  if (bio) {
    return `${nom} - ${bio}`
  }
  return nom
}

creerProfil("Alice")                 // ✅ "Alice"
creerProfil("Alice", "Dev TypeScript")  // ✅ "Alice - Dev TypeScript"

// Paramètre avec valeur par défaut
function creerMessage(texte: string, auteur: string = "Anonyme"): string {
  return `${auteur} dit : ${texte}`
}

creerMessage("Salut !")              // ✅ "Anonyme dit : Salut !"
creerMessage("Salut !", "Bob")       // ✅ "Bob dit : Salut !"

// ⚠️ Les optionnels viennent APRÈS les obligatoires
// function bad(a?: string, b: number) {}  // ❌ Pas logique

3.3Rest parameters (paramètres variadiques)

TypeScripttypescript
// Nombre variable d'arguments
function somme(...nombres: number[]): number {
  return nombres.reduce((total, n) => total + n, 0)
}

somme(1, 2, 3)          // ✅ 6
somme(10, 20, 30, 40)   // ✅ 100

// Combiner avec des paramètres fixes
function logAction(action: string, ...details: string[]): void {
  console.log(`[${action}] ${details.join(", ")}`)
}

logAction("SAVE", "fichier.ts", "ligne 42", "auto-save")

3.4Types de fonctions

Tu peux déclarer le type d'une fonction elle-même - utile pour les callbacks :

TypeScripttypescript
// Type d'une fonction
type Operation = (a: number, b: number) => number

const addition: Operation = (a, b) => a + b
const soustraction: Operation = (a, b) => a - b

// Très utile pour les callbacks
function appliquer(x: number, y: number, fn: Operation): number {
  return fn(x, y)
}

appliquer(10, 5, addition)      // 15
appliquer(10, 5, soustraction)  // 5

// Callback typé inline
function filtrer(
  tableau: number[],
  condition: (n: number) => boolean
): number[] {
  return tableau.filter(condition)
}

filtrer([1, 2, 3, 4, 5], n => n > 3)  // [4, 5]

3.5Surcharges de fonctions (Overloads)

Parfois, une même fonction accepte différents types d'arguments et retourne différents types. Les surcharges permettent de décrire ça précisément :

TypeScripttypescript
// Signatures de surcharge
function formater(valeur: string): string
function formater(valeur: number): string
function formater(valeur: string | number): string {
  if (typeof valeur === "string") {
    return valeur.toUpperCase()
  }
  return valeur.toFixed(2)
}

formater("bonjour")  // "BONJOUR" - retour string
formater(3.14159)    // "3.14"    - retour string

// Exemple plus concret
function chercher(id: number): Utilisateur
function chercher(email: string): Utilisateur
function chercher(critere: number | string): Utilisateur {
  if (typeof critere === "number") {
    return trouverParId(critere)
  }
  return trouverParEmail(critere)
}

3.6Fonctions génériques (introduction)

Les génériques permettent de créer des fonctions qui marchent avec n'importe quel type tout en gardant la sécurité :

TypeScripttypescript
// Sans générique : perte d'information
function premier(tableau: any[]): any {
  return tableau[0]
}
// On ne sait pas quel type est retourné...

// Avec générique : le type est préservé
function premierElement<T>(tableau: T[]): T {
  return tableau[0]
}

premierElement([1, 2, 3])           // type retourné: number
premierElement(["a", "b", "c"])     // type retourné: string
premierElement([true, false])       // type retourné: boolean

// TypeScript infère automatiquement le T
// Mais tu peux le préciser :
premierElement<string>(["hello"])   // type retourné: string

3.7Assertions de type

TypeScripttypescript
// Parfois tu en sais plus que TypeScript
const input = document.getElementById("email") as HTMLInputElement
input.value = "alice@email.com"  // ✅ Sans "as", TS ne saurait pas que c'est un input

// Syntaxe alternative (pas en JSX)
const button = <HTMLButtonElement>document.getElementById("btn")

// ⚠️ L'assertion ne fait AUCUNE vérification au runtime
// C'est une promesse que tu fais à TypeScript
const donnees = JSON.parse('{"nom": "Alice"}') as { nom: string }
// Si le JSON n'a pas cette forme, crash au runtime !

Verifie tes acquis

3 questions pour valider ce chapitre

1. Comment typer un parametre optionnel en TypeScript ?

Valide et sauvegarde ce chapitre

Ne perds pas le fil de ton apprentissage. Chaque QCM terminé sauvegarde ton score. Crée ton profil gratuitement pour débloquer toutes les évaluations du site et retrouver tes résultats plus tard.

Commencer l'aventure
Déjà membre ?Connecte-toi