TypeScript Conditional Types (original) (raw)

Last Updated : 24 Jan, 2025

In TypeScript, conditional types enable developers to create types that depend on a condition, allowing for more dynamic and flexible type definitions.

type IsString = T extends string ? 'Yes' : 'No';

type Test1 = IsString; type Test2 = IsString;

console.log('Test1:', 'Yes'); console.log('Test2:', 'No');

`

**Output:

**Test1: Yes
**Test2: No

JavaScript `

type Num = T extends number[] ? number : (T extends string[] ? string : never)

// Return num const num: Num<number[]> = 4;

// Return invalid const stringnum: Num = "7";

console.log(num, stringnum);

`

Conditional Type Constraints

Conditional type constraints allow defining constraints on generic types within conditional types, enabling dynamic and precise type handling.

JavaScript `

type CheckNum = T extends number ? T : never;

type NumbersOnly<T extends any[]> = { [K in keyof T]: CheckNum<T[K]>; };

const num: NumbersOnly<[4, 5, 6, 8]> = [4, 5, 6, 8]; const invalid: NumbersOnly<[4, 6, "7"]> = [4, 6, "7"];

`

**Output:

Type '"7"' is not assignable to type 'never'.

Inferring Within Conditional Types

This feature extracts and utilizes types within a conditional type definition, enabling precise transformations.

JavaScript `

type ElementType = T extends (infer U)[] ? U : never;

const numbers: number[] = [1, 2, 3]; const element: ElementType = numbers[0]; const invalidElement: ElementType = "string";

`

**Output:

Type 'string' is not assignable to type 'number'.

Distributive Conditional Types

These types distribute over unions, applying conditional logic to each union member individually.

JavaScript `

type Colors = 'red' | 'blue' | 'green';

type ColorClassMap = { red: 'danger'; blue: 'primary'; green: 'success'; };

type MapColorsToClasses = T extends keyof ColorClassMap ? { [K in T]: ColorClassMap[T] } : never;

const redClass: MapColorsToClasses = { red: 'danger' }; const invalidClass: MapColorsToClasses = { yellow: 'warning' };

`

**Output:

Type '{ yellow: "warning"; }' is not assignable to type 'never'.

Best Practices of Using TypeScript Conditional Types