typescript mapped types union