2018-02-23 22:34:23 +03:00
|
|
|
export type DeepReadonly<T> = T extends any[] ? DeepReadonlyArray<T[number]> : T extends object ? DeepReadonlyObject<T> : T;
|
|
|
|
|
|
|
|
type NonFunctionPropertyNames<T> = { [K in keyof T]: T[K] extends Function ? never : K }[keyof T];
|
|
|
|
|
|
|
|
interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
|
|
|
|
|
|
|
|
type DeepReadonlyObject<T> = {
|
|
|
|
readonly [P in NonFunctionPropertyNames<T>]: DeepReadonly<T[P]>;
|
|
|
|
};
|
2018-10-14 18:45:37 +03:00
|
|
|
|
|
|
|
type TypeName<T> =
|
|
|
|
T extends string ? "string" :
|
|
|
|
T extends number ? "number" :
|
|
|
|
T extends boolean ? "boolean" :
|
|
|
|
T extends undefined ? "undefined" :
|
|
|
|
T extends Function ? "function" :
|
|
|
|
"object";
|