top of page

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


Околокомпьютерный блог Алика

  • alt.text.label.Facebook

© Околокомпьютерный блог Алика , 2022. Сайт создан на Wix.com

bottom of page