typescript type inference best practices