generate-license-file
Version:
Generates a text file containing all of the licenses for your production dependencies
56 lines (55 loc) • 1.49 kB
TypeScript
/**
* This type takes an intersection type and expands each intersected type into a new single type.
*
* Think of it like the following but for types rather than instances:
* ```ts
* const a = { a: 1 };
* const b = { b: 2 };
* const intersection = { ...a, ...b };
* ```
* a.k.a
* ```ts
* type A = { a: number };
* type B = { b: number };
* type Intersection = IntersectionExpander<A & B>;
* ```
*
* This is really useful because it means that IDE tooltips
* show all the fields from the intersected types rather than
* just the intersection itself
*
* If you simply use:
* ```ts
* type Intersection = A & B;
* ```
*
* Then an IDE tooltip will show:
* ```ts
* type Intersection = A & B;
* ```
*
* But if you use
* ```ts
* type Intersection = IntersectionExpander<A & B>;
* ```
*
* Then an IDE tooltip will show:
* ```ts
* type Intersection = {
* a: number;
* b: number;
* }
* ```
*
* This means we can use the `IntersectionExpander` type to
* compose options interfaces together and have the IDE
* show all the fields within each option interface.
*
* The composition of options interfaces is important because
* it means we only need to write the JSdoc for each option once.
*
* @link https://stackoverflow.com/a/69288824/3075190
*/
export type IntersectionExpander<T> = T extends (...args: infer A) => infer R ? (...args: IntersectionExpander<A>) => IntersectionExpander<R> : T extends infer O ? {
[K in keyof O]: O[K];
} : never;