typeIsArray<T>=Textends any[]?true:false;typeTest1=IsArray<string[]>;// truetypeTest2=IsArray<number>;// false// Extracting element typestypeElementOf<T>=Textends(inferE)[]?E: never;typeStrEl=ElementOf<string[]>;// stringtypeNumEl=ElementOf<number[]>;// numbertypeNoEl=ElementOf<boolean>;// never
Output
// Conditional types act like type-level if/else
Note When a conditional type receives a union as T, it distributes - the condition is applied to each union member independently. To prevent distribution, wrap both sides in brackets: [T] extends [Condition].
typeIsString<T>=Textends string ?"yes":"no";typeA=IsString<string>;// "yes"typeB=IsString<number>;// "no"typeC=IsString<"hello">;// "yes"// Practical: flatten one level of arraytypeFlatten<T>=TextendsArray<inferItem>?Item:T;typeStr=Flatten<string[]>;// stringtypeNum=Flatten<number>;// number (not an array, returned as-is)
Output
// Conditional types branch on whether T matches a shape
Note Conditional types distribute over naked union type parameters: IsString<string | number> becomes IsString<string> | IsString<number> = "yes" | "no". Wrap in tuple to prevent distribution: [T] extends [string] ? ... : ...
Frequently asked questions
How does TypeScript handle conditional type?
TypeScript covers this with 2 copy-ready snippets on this page. The "Generics with Conditional Types" snippet in TypeScript uses `type Name<T> = T extends Condition ? TrueType : FalseType;`.
Which code does the TypeScript example use?
The "Generics with Conditional Types" snippet uses `type Name<T> = T extends Condition ? TrueType : FalseType;`, from the Generics section of the TypeScript cheat sheet.
What other TypeScript snippets are shown for "conditional type"?
Besides "Generics with Conditional Types", this page also shows "Conditional Types".
Is there anything to watch out for?
Yes. For "Generics with Conditional Types": When a conditional type receives a union as T, it distributes - the condition is applied to each union member independently. To prevent distribution, wrap both sides in brackets: [T] extends [Condition].