/*** makes all types in tuple readonly except functions * MakeReadonly<[object, Function, string[]]> is equal to * [ReadonlyObject, Function, ReadonlyArray] **/ type ReadonlyTuple = { readonly [K in keyof T]: Immutable; }; type Immutable = T extends (infer P)[] ? ReadonlyArray

: T extends Map ? ReadonlyMap : T extends ReadonlyMap ? T : T extends ReadonlyArray ? T : T extends Function ? T : T extends object ? ReadonlyObject : Readonly; export type ReadonlyObject = { readonly [K in keyof T]: Immutable; }; type TupleHead = T extends [infer U, ...any[]] ? U : never; export type PureComputed> = (...args: ReadonlyTuple) => Immutable; export type GetMessageFn = (messageKey: string, params?: object) => string; export interface IDependency { name: string; optional?: boolean; }