Typesctipt - кое-что по генерации типов
- Алик Ким
- 4 мар. 2023 г.
- 2 мин. чтения
Обновлено: 6 мар. 2023 г.
Typescript - индексное свойство
не помню, как называется по-нормальному😕
если в типе присутствует индексное свойство (или как там правильно?):
type TypeA = {
[keyNum: string]: number;
age: number;
};
его смысл: все поля должны быть обозначенного типа. ну и с ним совместимы все типы с любыми полями указанного типа (есть еще какие то нюансы с типами ключей самих. ключи могут быть в индексном свойстве строковыми, нумериковыми и symbol)
кроме того, тип всех остальных свойств должен быть совместим с типом индексного.
например, вот так - будет ошибка:
type TypeA = {
[keyNum: string]: boolean;
age: number;
};
Typescript - keyof
смысл keyof - генерация типа, который может принять в качестве значения любой ключ изначального типа(т.е. любое значение , которое можно применить к объекту при индексной нотации (obj["property_name"]) - можно присвоить переменной типа, полученного для типа этого объекта через keyof)
для типа
type TypeA = {
[keyNum: number]: unknown;
age: number;
};
keyof вернет (number | "age");
Typescript - indexed access types
type TypeA = {
age: number;
};
TypeA["age"] вернет тип number
пример посложнее:
type Person = { age: number; name: string; alive: boolean };
type AliveOrName = "alive" | "name";
type I3 = Person[AliveOrName]; //(boolean | string)
Typescript - Template Literal Types
возможность делать из типов-строковых литералов ("aaa" | "bbb") делать производные литеральные типы.
type World = "world" | "alik";
type Greeting = `hello ${World}`; //"hello world" | "hello alik"
Typescript - Mapped Types
фича TS, позволяющая генерить типы (~DTOшки, наборы полей) на основе ключей (и их типов) существующих типов.
то есть, например, берем все ключи, и делаем все типы необязательными.
в смысле, появляется копия типа с обязательными ключами, у которого все ключи такие же, но опциональные (с вопросиком)
есть ряд операций, которые можно делать, он описан тут: https://www.typescriptlang.org/docs/handbook/2/mapped-types.html
вот тут объяснение и хороший иллюстрирующий пример:
type User = {
name: string;
age: number;
email: string;
password: string;
friends: User[];
};
type MyPermissions = 'read' | 'write';
type UserPermissions = {
[Property in keyof User as `${MyPermissions}${Capitalize<Property>}`]: boolean;
};
//UserPermissions содержит булевы поля вида nameRead, nameWrite...
я так понял, что во многом синтаксис тут нужно, скорее, запомнить, чем понять какой то общий принцип.
Conditional Types
type Example1 = Dog extends Animal ? number : string;
могут быть полезны в генерик-типах, воде бы
или когда в зависимости от входного типа должен возвращаться какой-то выходной тип у метода
type MessageOf<T extends { message: unknown }> = T["message"];
type Flatten<Type> = Type extends Array<infer Item> ? Item : Type;
тут через infere - получаем новый генерик-парам
не знаю не прочувствовал крутость этой штуки. может, на практике как нибудь вылезет понимание...
Utility Types
есть целый набор встроенных типов вроде Capitalize.
кстати, реализация некоторых из них состоит из слова "intrinsic". это значит, что они реализованы не просто на тайпскрипте, а ~движком Typescript
Commenti