TypeScript
Beginner
1 min read
Mapped Types and Key Remapping
Example
// Mapping over an object type
type Mutable<T> = {
-readonly [K in keyof T]: T[K]; // remove readonly
};
type Required2<T> = {
[K in keyof T]-?: T[K]; // remove optional (-)
};
// Key remapping with 'as'
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
interface UserModel { id: number; name: string; email: string }
type UserGetters = Getters<UserModel>;
// { getId: () => number; getName: () => string; getEmail: () => string }
// Filter keys by value type
type PickByValue<T, V> = {
[K in keyof T as T[K] extends V ? K : never]: T[K];
};
interface Mixed {
id: number;
name: string;
count: number;
label: string;
}
type OnlyStrings = PickByValue<Mixed, string>;
// { name: string; label: string }
// Deep partial
type DeepPartial<T> = {
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
};
interface Config {
server: { host: string; port: number };
database: { url: string; name: string };
debug: boolean;
}
const partialConfig: DeepPartial<Config> = {
server: { port: 8080 }, // only overriding port
};
Related Resources
TypeScript Reference
Complete tag & property list
TypeScript How-To Guides
Step-by-step practical guides
TypeScript Exercises
Practice what you've learned
More in TypeScript