TS2344

Type '{ name: string; }' does not satisfy the constraint '{ age: number; }'. Property 'age' is missing in type '{ name: string; }' but required in type '{ age: number; }'.

Broken Code ❌

function increaseAge<T extends { age: number }>(data: T): T {
  data.age += 1;
  return data;
}
 
increaseAge<{ name: string }>({ age: 25, name: 'Benny' });

Fixed Code ✔️

The "constraint" in this context is set by the T extends statement. When passing a type argument, the required properties of the type variable (T) must be matched:

function increaseAge<T extends { age: number }>(data: T): T {
  data.age += 1;
  return data;
}
 
increaseAge<{ age: number; name: string }>({ age: 25, name: 'Benny' });

As an alternative, type argument inference can be used:

function increaseAge<T extends { age: number }>(data: T): T {
  data.age += 1;
  return data;
}
 
increaseAge({ age: 25, name: 'Benny' });