// https://github.com/Microsoft/TypeScript/issues/25379 interface Map { // ... } export type ImmutableTypes = IImmutableMap; export type ImmutableModel = { [K in keyof T]: T[K] extends ImmutableTypes ? T[K] : never }; export interface IImmutableMap> extends Map { set(key: K, value: T[K]): IImmutableMap; } export type ImmutableTypes2 = IImmutableMap2; type isImmutableType = [T] extends [ImmutableTypes2] ? T : never; export type ImmutableModel2 = { [K in keyof T]: isImmutableType }; export interface IImmutableMap2> extends Map { set(key: K, value: T[K]): IImmutableMap2; }