e2ed
Version:
E2E testing framework over Playwright
30 lines (29 loc) • 1.17 kB
TypeScript
import type { IsBrand } from './brand';
/**
* Mutable type with recursive applying.
* `DeepMutable<{readonly foo: {readonly bar: 0}}>` = `{foo: {bar: 0}}`.
*/
export type DeepMutable<Type> = keyof Type extends never ? Type : IsBrand<Type> extends true ? Type : {
-readonly [Key in keyof Type]: DeepMutable<Type[Key]>;
};
/**
* Partial type with recursive applying.
* `DeepPartial<{foo: {bar: 0}}>` = `{foo?: {bar?: 0}}`.
*/
export type DeepPartial<Type> = keyof Type extends never ? Type : IsBrand<Type> extends true ? Type : {
[Key in keyof Type]?: DeepPartial<Type[Key]>;
};
/**
* Readonly type with recursive applying.
* `DeepReadonly<{foo: {bar: 0}}>` = `{readonly foo: {readonly bar: 0}}`.
*/
export type DeepReadonly<Type> = keyof Type extends never ? Type : IsBrand<Type> extends true ? Type : {
readonly [Key in keyof Type]: DeepReadonly<Type[Key]>;
};
/**
* Required type with recursive applying.
* `DeepRequired<{foo?: {bar?: 0}}>` = `{foo: {bar: 0}}`.
*/
export type DeepRequired<Type> = keyof Type extends never ? Type : IsBrand<Type> extends true ? Type : {
[Key in keyof Type]-?: DeepRequired<Exclude<Type[Key], undefined>>;
};