@redux-ts-starter-kit/slice
Version:
reduce redux boilerplate
42 lines (41 loc) • 3.25 kB
TypeScript
export declare type PartialKeys<T, K extends PropertyKey = PropertyKey> = Partial<Pick<T, Extract<keyof T, K>>> & Omit<T, K> extends infer O ? {
[P in keyof O]: O[P];
} : never;
/**
* @author 'tsdef'
*/
export declare type IsAny<T, True, False = never> = True | False extends (T extends never ? True : False) ? True : False;
/**
* @author 'tsdef'
*/
export declare type IsUnknown<T, True, False = never> = unknown extends T ? IsAny<T, False, True> : False;
/**
* @see https://stackoverflow.com/questions/51465182/how-to-remove-index-signature-using-mapped-types
*/
export declare type RemoveIndex<T> = {
[K in keyof T as string extends K ? never : number extends K ? never : K]: T[K];
};
export interface Action<T extends string = string> {
readonly type: T;
}
export interface NotEmptyObject {
[s: string]: string | number | symbol | boolean | object | undefined | null;
[s: number]: string | number | symbol | boolean | object | undefined | null;
}
export interface AnyAction<T extends string = string> extends Action<T> {
[s: string]: any;
}
export interface PayloadAction<P = any, T extends string = string> extends Action<T> {
readonly payload: P;
}
declare type IncreaseNum<N extends number> = IsAny<N, never, false> extends false ? number extends N ? never : N extends 0 ? 1 : N extends 1 ? 2 : N extends 2 ? 3 : N extends 3 ? 4 : N extends 4 ? 5 : N extends 5 ? 6 : N extends 6 ? 7 : N extends 7 ? 8 : N extends 8 ? 9 : N extends 9 ? 10 : N extends 10 ? 11 : N extends 11 ? 12 : N extends 12 ? 13 : N extends 13 ? 14 : N extends 14 ? 15 : N extends 15 ? 16 : N extends 16 ? 17 : N extends 17 ? 18 : N extends 18 ? 19 : N extends 19 ? 20 : N extends 20 ? 21 : N extends 21 ? 22 : N extends 22 ? 23 : N extends 23 ? 24 : N extends 24 ? 25 : N extends 25 ? 26 : N extends 26 ? 27 : N extends 27 ? 28 : N extends 28 ? 29 : N extends 29 ? 30 : N extends 30 ? 31 : N extends 31 ? 32 : N extends 32 ? 33 : N extends 33 ? 34 : never : never;
export declare type NestedObject<S extends string[] | ReadonlyArray<string>, Start extends number, Fin, Max extends number = GetArrayLength<S>> = number extends Start ? never : Start extends Max ? Fin : {
[K in S[Start]]: NestedObject<S, IncreaseNum<Start>, Fin, Max>;
};
export declare type GetArrayLength<S extends any[] | ReadonlyArray<any>> = S extends {
length: infer L;
} ? L : never;
export declare type Getter<P extends string[] | ReadonlyArray<string>, O extends {
[s: string]: any;
}> = GetArrayLength<P> extends 0 ? O : GetArrayLength<P> extends 1 ? O[P[0]] : GetArrayLength<P> extends 2 ? O[P[0]][P[1]] : GetArrayLength<P> extends 3 ? O[P[0]][P[1]][P[2]] : GetArrayLength<P> extends 4 ? O[P[0]][P[1]][P[2]][P[3]] : GetArrayLength<P> extends 5 ? O[P[0]][P[1]][P[2]][P[3]][P[4]] : GetArrayLength<P> extends 6 ? O[P[0]][P[1]][P[2]][P[3]][P[4]][P[5]] : GetArrayLength<P> extends 7 ? O[P[0]][P[1]][P[2]][P[3]][P[4]][P[5]][P[6]] : GetArrayLength<P> extends 8 ? O[P[0]][P[1]][P[2]][P[3]][P[4]][P[5]][P[6]][P[7]] : GetArrayLength<P> extends 9 ? O[P[0]][P[1]][P[2]][P[3]][P[4]][P[5]][P[6]][P[7]][P[8]] : GetArrayLength<P> extends 10 ? O[P[0]][P[1]][P[2]][P[3]][P[4]][P[5]][P[6]][P[7]][P[8]][P[9]] : never;
export {};