Записи TypeScript — отличный способ обеспечить согласованность при попытке реализовать более сложные типы данных. Они применяют ключевые значения и позволяют создавать настраиваемые интерфейсы для значений.

Звучит запутанно, но давайте посмотрим, как это работает на практике.

Типы утилит

Record — это служебный тип, то есть это тип, специально определенный в TypeScript для помощи в решении определенной проблемы.

Как работают типы записей машинописного текста

Предположим, у вас есть такой набор данных:

const myData = {
    "123-123-123" : { firstName: "John", lastName: "Doe" },
    "124-124-124" : { firstName: "Sarah", lastName: "Doe" },
    "125-125-125" : { firstName: "Jane", lastName: "Smith" }
}

Наш набор данных имеет идентификатор для своего ключа, который имеет строковый тип. Все значения имеют одинаковый формат, то есть у них есть имя и фамилия.

Для этой структуры данных лучше всего использовать служебный тип Record. Мы можем определить тип нашей структуры данных следующим образом:

type User = {
    firstName: string,
    lastName: string
}
const myData:Record<string, User> = {
    "123-123-123" : { firstName: "John", lastName: "Doe" },
    "124-124-124" : { firstName: "Sarah", lastName: "Doe" },
    "125-125-125" : { firstName: "Jane", lastName: "Smith" }
}

Запись принимает форму Record<K, T>, где K — тип ключа, а T — тип значений.

Выше мы определили новый тип User для наших значений и установили для наших ключей тип string.

Типы записей и типы объединения

Иногда у нас может быть объект с предопределенным набором возможных ключей. Это особенно верно при вызове из API. Например:

const myData = {
    "uk" : { firstName: "John", lastName: "Doe" },
    "france" : { firstName: "Sarah", lastName: "Doe" },
    "india" : { firstName: "Jane", lastName: "Smith" }
}

Предположим, что для нашего набора данных выше ключ может принимать только три значения: Великобритания, Франция или Индия. В этом случае мы можем определить тип для пользователя и тип объединения для нашего ключа:

type User = {
    firstName: string,
    lastName: string
}
type Country = "uk" | "france" | "india";
const myData:Record<Country, User> = {
    "uk" : { firstName: "John", lastName: "Doe" },
    "france" : { firstName: "Sarah", lastName: "Doe" },
    "india" : { firstName: "Jane", lastName: "Smith" }
}

Используя этот метод, мы можем применять строгие правила в отношении значений, которые разрешено использовать ключу, а также тип, которому должны соответствовать наши значения.

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