Краткий обзор того, как тип утилиты Extract работает в TypeScript.

Вспомогательный тип Extract позволяет нам проверять тип объединения для определенных членов и возвращает новый тип на основе того, что осталось. Вполне похож по формату на тип Exclude.

Давайте узнаем, как это работает.

Типы утилит

Служебные типы — это типы, определенные в TypeScript для решения конкретных задач. Если вы новичок в определении пользовательских типов в TypeScript, прочитайте мое руководство по определению пользовательских типов здесь:



Как работает Extract Type в TypeScript

В TypeScript мы можем определить определенный тип, называемый типом объединения. Тип объединения — это список возможных значений чего-либо. Ниже показан пример, где тип myUnionType означает, что переменные и другие выходные данные могут иметь только одно из четырех значений: 🥒, 🥔, 🌶 или 🌽.

type myUnionType = "🥒" | "🥔" | "🌶" | "🌽"
// This works since 🥒 is a member of "🥒" | "🥔" | "🌶" | "🌽"
let myFirstVariable:myUnionType = "🥒"
// This doesn't work since "my-string" is NOT member of "🥒" | "🥔" | "🌶" | "🌽"
let mySecondVariable:myUnionType = "my-string"

Тип извлечения

Если мы хотим удалить определенные элементы из типа объединения, мы можем использовать тип Exclude, но есть и другие способы манипулирования типами объединения.

Тип Extract позволяет нам определить новый список и возвращает новый тип, если какие-либо элементы в этом списке существуют в нашем исходном типе.

Давайте посмотрим на быстрый пример:

type myUnionType = "🥒" | "🥔" | "🌶" | "🌽"
let myFirstVariable:Extract<myUnionType, "🥒" | "🥔"> = "🥒"
//  ^
//  └ - - Type is "🥒" | "🥔"

Когда мы пишем Extract, он проверяет myUnionType на "🥒" | "🥔". Если они существуют, создается новый тип, содержащий существующие элементы. Поскольку и 🥒, и 🥔 существуют в нашем типе объединения, мы получаем новый тип — "🥒" | "🥔".

Если мы определим члены в нашем операторе Extract, которые не существуют в нашем исходном типе объединения, то они будут проигнорированы в новом типе. Например:

type myUnionType = "🥒" | "🥔" | "🌶" | "🌽"
let myFirstVariable:Extract<myUnionType, "🥒" | "🥔" | "🍇"> = "🥒"
//  ^
//  └ - - Type is STILL "🥒" | "🥔" since "🍇" is not in myUnionType

Использование Extract не влияет на исходный тип, поэтому мы можем использовать его, если захотим:

type myUnionType = "🥒" | "🥔" | "🌶" | "🌽"
let myFirstVariable:Extract<myUnionType, "🥒" | "🥔" | "🍇"> = "🥒"
//  ^
//  └ - - Type is "🥒" | "🥔"
let mySecondVariable:myUnionType = "🌶"
//  ^
//  └ - - Type is "🥒" | "🥔" | "🌶" | "🌽"

Таким образом, Extract — отличный инструмент, когда мы хотим ограничить исходный тип объединения заданным числом определенных членов для определенных переменных или выходных данных. Это дает нам гибкость, позволяющую определять типы на лету, которые мы можем использовать в любом месте нашего кода.

Это для этой темы. Спасибо за чтение.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.