type Exact = A extends B ? B : B extends Record ? { [K in keyof B]: K extends keyof A ? Exact : never } : B extends Array ? { [K in keyof B]: K extends keyof A ? Exact : never } : never; function invariantize( fun: (a: A) => R ): (a: Exact) => R { return fun as any; }