ixfx
Version:
A framework for programming interactivity
29 lines (27 loc) • 1.38 kB
TypeScript
/**
* Remaps `TShape` so each field has type `TFieldValue`.
* Recursive.
*/
type RecursiveReplace<TShape, TFieldValue> = {
[P in keyof TShape]: TShape[P] extends Array<infer U> ? Array<RecursiveReplace<U, TFieldValue>> : TShape[P] extends number | string | symbol | undefined ? TFieldValue : RecursiveReplace<TShape[P], TFieldValue>;
};
type RecursivePartial<T> = {
[P in keyof T]?: T[P] extends Array<infer U> ? Array<RecursivePartial<U>> : T[P] extends object | undefined ? RecursivePartial<T[P]> : T[P];
};
type ReadonlyRemapObjectPropertyType<OriginalType, PropertyType> = {
readonly [Property in keyof OriginalType]: PropertyType;
};
type RemapObjectPropertyType<OriginalType, PropertyType> = {
[Property in keyof OriginalType]: PropertyType;
};
type Writeable<T> = {
-readonly [P in keyof T]: T[P];
};
type DeepWriteable<T> = {
-readonly [P in keyof T]: DeepWriteable<T[P]>;
};
type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
[K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, undefined>>;
}[Keys];
type Rest<T extends Array<any>> = T extends [infer A, ...infer R] ? R : never;
export type { DeepWriteable as D, RecursiveReplace as R, Writeable as W, RecursivePartial as a, ReadonlyRemapObjectPropertyType as b, RemapObjectPropertyType as c, RequireOnlyOne as d, Rest as e };