Skip to content

Instantly share code, notes, and snippets.

@litera
Last active September 21, 2023 16:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save litera/cfaf33d1780290e3094747e4f66791df to your computer and use it in GitHub Desktop.
Save litera/cfaf33d1780290e3094747e4f66791df to your computer and use it in GitHub Desktop.
Typescript useful utility types
type Prefix<TModel extends {}, P extends string> = {
[Key in string & keyof TModel as `${P}${Capitalize<Key>}`]: TModel[Key];
}
type Suffix<TModel extends {}, S extends string> = {
[Key in string & keyof TModel as `${Key}${Capitalize<S>}`]: TMOdel[Key];
}
// EnsureProps<{}> = never
// EnsureProps<Person> = Person
type EnsureProps<TModel> = keyof TModel extends never ? never : TModel;
// copied from https://stackoverflow.com/a/69288824/75642
export type Expand<T> = T extends (...args: infer A) => infer R
? (...args: Expand<A>) => Expand<R>
: T extends infer O
? { [K in keyof O]: O[K] }
: never;
export type ExpandRecursively<T> = T extends (...args: infer A) => infer R
? (...args: ExpandRecursively<A>) => ExpandRecursively<R>
: T extends object
? T extends infer O
? { [K in keyof O]: ExpandRecursively<O[K]> }
: never
: T;
// Use as:
// type SomeExpandedType = Expand<SomeConvolutedType>;
// type SomeFullyExpandedType = ExpandRecursively<SomeConvolutedType>;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment