Tsfix It's not yelling at you, just at your types. Loose Type whatever value in type unions without loosing intellisense and type safety. type Loose<T> = T | (string & {}); Func Better function type constructor. type Func<T = any, R = any> = (...args: T[]) => R;