how to use typescript generics