TypeScript playground or ts-node
Create utility types using conditional types: DeepReadonly, FlattenArray, PromiseChain.
1 // Utility: is T an array? 2 type IsArray<T> = T extends any[] ? true : false; 3 type T1 = IsArray<string[]>; // true 4 type T2 = IsArray<string>; // false 5 6 // Flatten one level of array 7 type FlattenArray<T> = T extends Array<infer U> ? U : T; 8 type T3 = FlattenArray<string[][]>; // string[] 9 type T4 = FlattenArray<string[]>; // string 10 type T5 = FlattenArray<string>; // string (not an array) 11 12 // Deep readonly 13 type DeepReadonly<T> = T extends (infer U)[] 14 ? ReadonlyArray<DeepReadonly<U>> 15 : T extends object 16 ? { readonly [K in keyof T]: DeepReadonly<T[K]> } 17 : T; 18 19 interface Config { 20 server: { host: string; port: number }; 21 db: { url: string; pool: { min: number; max: number } }; 22 } 23 24 type FrozenConfig = DeepReadonly<Config>; 25 // All nested fields are readonly — even server.host and db.pool.min 26 27 // Filter union members 28 type NonNullableUnion<T> = T extends null | undefined ? never : T; 29 type T6 = NonNullableUnion<string | null | undefined | number>; 30 // string | number 31 32 // Test runner 33 type Assert<T extends true> = T; 34 type Test1 = Assert<IsArray<string[]>>; 35 type Test2 = Assert<IsArray<number> extends false ? true : false>; 36 type Test3 = Assert<FlattenArray<string[]> extends string ? true : false>; 37 38 console.log('All type tests pass (TypeScript validates at compile time)');
FlattenArray<string[][]> = string[]; DeepReadonly<User> makes all nested fields readonly
Sign in to share your feedback and join the discussion.