Description Re-map keys in mapped types. See the PR[fn:pr] for more information. Syntax type MappedTypeWithNewKeys<T> = { [K in keyof T as NewKeyType]: T[K] // ^^^^^^^^^^^^^ // This is the new syntax! } Leverage template literal types to create property names based off old ones type Getters<T> = { [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K] }; interface Person { name: string; age: number; location: string; } type LazyPerson = Getters<Person>; Filter out keys // Remove the 'kind' property type RemoveKindField<T> = { [K in keyof T as Exclude<K, "kind">]: T[K] }; interface Circle { kind: "circle"; radius: number; } type KindlessCircle = RemoveKindField<Circle>; // same as // type KindlessCircle = { // radius: number; // };