typescript generic enum constraint