ts-deep-pick
Version:
TypeScript utility generating new types by deep picking/omitting, leveraging Template Literal Types from TypeScript >= 4.1
15 lines • 1.19 kB
TypeScript
import { Primitive, UnionKeyOf } from "ts-typetools";
import { DeepPickGrammar, DefaultGrammar } from "./DeepPickGrammar";
import { Opaque } from "./Opaque";
export declare type DeepPickPath<T, G extends DeepPickGrammar = DefaultGrammar> = ((T extends Opaque ? never : T extends Primitive ? never : T extends Array<infer T> ? T extends Primitive ? never : InnerKey<T, G["array"], G> : {
[key in KeyOf<T>]: key | InnerKey<T[key], key, G>;
}[KeyOf<T>] | OmitKey<T, G>) | G["glob"]) & string;
declare type InnerKey<T, key extends string, G extends DeepPickGrammar> = (T extends Opaque ? never : T extends Primitive ? never : T extends Array<infer T> ? T extends Primitive ? never : `${key}${G["prop"]}${InnerKey<T, G["array"], G> & string}` : {
[key2 in KeyOf<T>]: `${key}${G["prop"]}${key2}` | `${key}${G["prop"]}${InnerKey<T[key2], key2, G> & string}`;
}[KeyOf<T>] | `${key}${G["prop"]}${OmitKey<T, G>}`) extends infer Key ? Key | `${G["mutate"]}${Key & string}` : never;
declare type OmitKey<T, G extends DeepPickGrammar> = {
[key in KeyOf<T>]: `${G["omit"]}${key}`;
}[KeyOf<T>];
declare type KeyOf<T> = UnionKeyOf<T> & string;
export {};
//# sourceMappingURL=DeepPickPath.d.ts.map