Conditional types in TypeScript are types are created on the basis of a condition.

Structure

type nameOfType = aType extends anotherType ? TrueType : FalseType

What we are telling TypeScript is to create a new type called nameOfType based on evaluating the expression of whether aType is an extension or subset of anotherType. If that is true, then nameOfType becomes of type TrueType. Otherwise, it becomes FalseType.

Examples

type Vehicle = {
  make: string,
  model: string,
  typeOfVehicle: string,
}

type Car = {make: string}

type CarMake = Vehicle extends Car ? string : null; //type CarMake = string;

If we were to replace the property in Car with a property and data type that does not exist in Vehicle, we would get null:

type Vehicle = {
  make: string,
  model: string,
  typeOfVehicle: string,
}

type Car = {year: number}

type CarMake = Vehicle extends Car ? string : null; //type CarMake = null;

We can also use conditional types with Generics:

type isBoolean<T> = T extends boolean ? true : false;

type isActive = boolean;

type userIsActive = isBoolean<isActive> //type userIsActive = true