@noodletired/rest-ts-core
Version:
Type-safe rest API definitions to share
51 lines (50 loc) • 2.93 kB
TypeScript
/**
* Converts a tuple of strings to a dictionnary where the keys are the strings of the input tuple,
* and the values are just `string`s
*/
export declare type Tuple2Dict<T> = T extends [infer A] ? A extends string ? {
[key in A]: string;
} : never : T extends [infer A, infer B] ? A extends string ? B extends string ? {
[key in A | B]: string;
} : never : never : T extends [infer A, infer B, infer C] ? A extends string ? B extends string ? C extends string ? {
[key in A | B | C]: string;
} : never : never : never : T extends [infer A, infer B, infer C, infer D] ? A extends string ? B extends string ? C extends string ? D extends string ? {
[key in A | B | C | D]: string;
} : never : never : never : never : T extends [infer A, infer B, infer C, infer D, infer E] ? A extends string ? B extends string ? C extends string ? D extends string ? E extends string ? {
[key in A | B | C | D | E]: string;
} : never : never : never : never : never : T extends [infer A, infer B, infer C, infer D, infer E, infer F] ? A extends string ? B extends string ? C extends string ? D extends string ? E extends string ? F extends string ? {
[key in A | B | C | D | E | F]: string;
} : never : never : never : never : never : never : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G] ? A extends string ? B extends string ? C extends string ? D extends string ? E extends string ? F extends string ? G extends string ? {
[key in A | B | C | D | E | F | G]: string;
} : never : never : never : never : never : never : never : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G, infer H] ? A extends string ? B extends string ? C extends string ? D extends string ? E extends string ? F extends string ? G extends string ? H extends string ? {
[key in A | B | C | D | E | F | G | H]: string;
} : never : never : never : never : never : never : never : never : {
[key in string]: string;
};
/**
* The set difference between T and U, where T and U are string literals or string literal unions.
*/
export declare type Diff<T, U> = T extends U ? never : T;
/**
* The record type T where the key Key has been omitted.
*/
export declare type RemoveKey<T, Key extends keyof T> = {
[K in Diff<keyof T, Key>]: T[K];
};
/**
* A record made of the values in T associated to the keys in Key. Key is a string literal or
* string literal union, and must represent valid index values of T.
*/
export declare type Pick<T, Key extends keyof T> = {
[K in Key]: T[K];
};
/**
* Remove keys whose values can be assigned undefined.
*/
export declare type UndefineableKeys<T, Keys> = Keys extends keyof T ? undefined extends T[Keys] ? Keys : never : never;
/**
* Makes keys whose value can be assigned undefined optional.
*/
export declare type MakeUndefineableKeysOptional<T> = {
[k in Diff<keyof T, UndefineableKeys<T, keyof T>>]: T[k];
} & Partial<T>;