В TypeScript есть много удобных типов которые позволяет сделать код проще и понятнее. Эти типы доступны из коробки и не требуют импортов или других дополнительных действий.
Вот некоторые из них:
ReturnType<Type>
Этот тип позволяет достать тип возвращаемого значения из функции.
1const fn = () => 1;
2type T = ReturnType<typeof fn>; // number
Awaited<Type>
Этот тип позволяет достать тип значения из промиса.
1const fn = () => Promise.resolve("hello");
2type T = Awaited<ReturnType<typeof fn>>; // string
Partial<Type>
Этот тип позволяет сделать все свойства типа необязательными.
1interface User {
2 name: string;
3 email: string;
4}
5
6type PartialUser = Partial<User>; // { name?: string | undefined; email?: string | undefined; }
Required<Type>
Этот тип позволяет сделать все свойства типа обязательными.
1interface User {
2 name?: string;
3 email?: string;
4}
5
6type RequiredUser = Required<User>; // { name: string; email: string; }
Pick<Type, Keys>
Этот тип позволяет создать новый тип из другого типа, используя указанные свойства.
1interface User {
2 name: string;
3 email: string;
4 age: number;
5}
6
7type UserWithoutAge = Pick<User, "name" | "email">; // { name: string; email: string; }
Omit<Type, Keys>
Этот тип позволяет исключить из типа указанные свойства.
1interface User {
2 name: string;
3 email: string;
4 age: number;
5}
6
7type UserWithoutAge = Omit<User, "age">; // { name: string; email: string; }
Record<Keys, Type>
Этот тип позволяет создать новый тип из указанных ключей и типа значений.
1type Counter = Record<string, number>;
2
3const counter: Counter = {
4 a: 1,
5 b: 2,
6 c: 3,
7};
Более сложный пример:
1type User = {
2 id: string;
3 name: string;
4 email: string;
5}
6
7type UsersById = Record<User["id"], Omit<User, "id">>; }
8
9const users: UsersById = {
10 "1": { name: "John", email: "john@me.com" },
11 "2": { name: "Jane", email: "jane@acme.com" },
12}
Для более подробной информации о типах в TypeScript, смотрите документацию.