Lors de l’accès aux API externes ou aux indices de tableaux, les valeurs peuvent devenir undefined, ce qui les rend difficiles à manipuler telles quelles au niveau du type. Utilisez les assertions non-null pour obtenir à la fois des vérifications d’exécution et un rétrécissement des types.
Code
function assertIsDefined<T>(value: T): asserts value is NonNullable<T> { if (value === undefined || value === null) { throw new Error(`Expected 'value' to be defined, but received ${value}`); }}
function nonNull<T>(value: T): NonNullable<T> { assertIsDefined(value); return value;}Exemples d’utilisation
Accès sécurisé aux éléments d’un tableau
const arr = [1, 2, 3];const value = arr[10]; // number | undefined
// Impossible d'éviter l'erreur de typeconsole.log(value.toFixed()); // Error: Object is possibly 'undefined'
// Utilisation de nonNullconst safeValue = nonNull(arr[10]);// Inféré comme NonNullable<number>console.log(safeValue.toFixed()); // OKValidation de la réponse API
interface User { name: string;}
async function getUser(id: string): Promise<User> { const response = await fetch(`/api/users/${id}`); const user = await response.json() as User | undefined;
// Erreur si la réponse est vide assertIsDefined(user);
// user peut être traité comme type User à ce stade return user;}Différence avec l’opérateur !
TypeScript dispose d’un opérateur d’assertion non-null value!, mais celui-ci n’effectue pas de vérifications à l’exécution. L’utilisation de fonctions d’assertion permet de valider les valeurs à l’exécution tout en rétrécissant également le type.
Précautions
Utilisez les fonctions d’assertion uniquement lorsque vous êtes convaincu qu’une valeur existe réellement. Une utilisation négligente entraînera des erreurs d’exécution. En particulier pour l’accès aux indices de tableaux, envisagez de vérifier la longueur au préalable.
hsb.horse