TypeScript - Утилитарные типы
Здравствуйте, будущие кодинговые маги! Сегодня мы отправимся в увлекательное путешествие по магическому миру утилитарных типов TypeScript. Не волнуйтесь, если вы новички в программировании; я буду вашим дружественным проводником, и мы вместе исследуем эти концепции, шаг за шагом. Так что возьмите свои виртуальные палочки (клавиатуры), и lets dive in!

Что такое утилитарные типы?
Прежде чем мы начнем, давайте поймем, что такое утилитарные типы. Представьте себе ящик с различными инструментами. Каждый инструмент помогает вам выполнять определенную задачу более эффективно. Именно такими и являются утилитарные типы в TypeScript - это预制 инструменты, которые помогают нам манипулировать и преобразовывать типы легко.
Теперь давайте рассмотрим каждый из этих магических инструментов по одному!
Тип Partial в TypeScript
Тип Partial resembles a spell that makes all properties in an object optional. It's super useful when you want to create an object where you don't need to specify all properties.
Давайте увидим это в действии:
interface Wizard {
  name: string;
  age: number;
  house: string;
}
function updateWizard(wizard: Wizard, fieldsToUpdate: Partial<Wizard>) {
  return { ...wizard, ...fieldsToUpdate };
}
const harryPotter: Wizard = {
  name: "Harry Potter",
  age: 11,
  house: "Gryffindor"
};
const updatedHarry = updateWizard(harryPotter, { age: 17 });
console.log(updatedHarry);
// Вывод: { name: "Harry Potter", age: 17, house: "Gryffindor" }В этом примере Partial<Wizard> позволяет нам обновить только возраст Гарри, не указывая все остальные свойства. Это как взмахнуть палочкой и сказать "Partial Revelio!"
Тип Required в TypeScript
Тип Required - это相反ность Partial. Это как casting a spell что делает все свойства в объекте обязательными, даже если ониoriginally были可选.
interface MagicalCreature {
  name: string;
  power?: string;
  age?: number;
}
const dragon: Required<MagicalCreature> = {
  name: "Norwegian Ridgeback",
  power: "Fire Breath",
  age: 2
};
// Это вызвало бы ошибку:
// const unicorn: Required<MagicalCreature> = {
//   name: "Silver Horn"
// };Здесь, даже though power и age были可选 в исходном интерфейсе, тип Required делает их обязаельными. Это как сказать "Accio all properties!"
Тип Pick в TypeScript
Тип Pick позволяет вам создать новый тип, выбрав конкретные свойства из существующего типа. Это как использовать заклинание Summoning Charm, чтобы призвать только те свойства, которые вам нужны.
interface Potion {
  name: string;
  ingredients: string[];
  brewingTime: number;
  effect: string;
}
type PotionLabel = Pick<Potion, 'name' | 'effect'>;
const polyjuicePotion: PotionLabel = {
  name: "Polyjuice Potion",
  effect: "Transforms the drinker into another person"
};В этом примере мы создали новый тип PotionLabel, который включает только свойства name и effect из интерфейса Potion. Это идеально для тех случаев, когда вам нужно только несколько конкретных деталей!
Тип Omit в TypeScript
Тип Omit - это相反ность Pick. Он создает новый тип, удаляя конкретные свойства из существующего типа. Представьте себе, что вы используете заклинание Vanishing Spell на некоторых свойствах!
interface SpellBook {
  title: string;
  author: string;
  pages: number;
  secretSpell: string;
}
type PublicSpellBook = Omit<SpellBook, 'secretSpell'>;
const beginnerSpellBook: PublicSpellBook = {
  title: "Standard Book of Spells, Grade 1",
  author: "Miranda Goshawk",
  pages: 250
};Здесь мы создали тип PublicSpellBook, который включает все свойства SpellBook, кроме secretSpell. Это как сказать "Show me everything but the secret!"
Тип Readonly в TypeScript
Тип Readonly resembles a protection spell on your properties. It makes all properties in a type read-only, preventing accidental modifications.
interface Wand {
  wood: string;
  core: string;
  length: number;
}
const harryWand: Readonly<Wand> = {
  wood: "Holly",
  core: "Phoenix feather",
  length: 11
};
// Это вызвало бы ошибку:
// harryWand.length = 12;С помощью Readonly мы ensured, что после создания палочки ее свойства нельзя изменить. Это как наложить неудаляемое заклинание на ваши объекты!
Тип ReturnType в TypeScript
Тип ReturnType позволяет извлечь тип返回 значения функции. Это как использовать заклинание Legilimency, чтобы заглянуть в функцию и увидеть, что она возвращает!
function castSpell(spellName: string): { name: string, power: number } {
  // Логика cast заклинания здесь
  return { name: spellName, power: Math.random() * 100 };
}
type SpellResult = ReturnType<typeof castSpell>;
const lumos: SpellResult = {
  name: "Lumos",
  power: 50
};В этом примере SpellResult выводится как { name: string, power: number }, что является типом返回 значения функции castSpell. Это incredibly полезно при работе с сложными функциями!
Тип Record в TypeScript
Тип Record - это powerful заклинание, которое создает объектный тип с конкретным типом ключа и типом значения. Это как призвать магическую карту, где вы определяете, какими должны быть ключи и значения.
type HouseCup = Record<string, number>;
const housePoints: HouseCup = {
  "Gryffindor": 472,
  "Hufflepuff": 352,
  "Ravenclaw": 426,
  "Slytherin": 472
};Здесь HouseCup - это тип, где ключи - это строки (имена домов), а значения - это числа (очки). Это гарантирует, что наш объект очков имеет правильную структуру.
Тип NonNullable в TypeScript
Тип NonNullable resembles a spell to banish null and undefined values. It creates a new type by excluding null and undefined from a given type.
type MagicalItem = string | number | null | undefined;
type DefiniteMagicalItem = NonNullable<MagicalItem>;
const definiteItem: DefiniteMagicalItem = "Invisibility Cloak";
// Это вызвало бы ошибку:
// const nullItem: DefiniteMagicalItem = null;В этом примере DefiniteMagicalItem - это тип, который может быть строкой или числом, но не null или undefined. Это идеально, когда вы хотите быть уверенными, что работаете с actual значениями!
Шпаргалка по утилитарным типам
Вот quick reference таблица для всех утилитарных типов, которые мы рассмотрели:
| Утилитарный тип | Описание | Пример | 
|---|---|---|
| Partial | Makes all properties in T optional | Partial<Wizard> | 
| Required | Makes all properties in T required | Required<MagicalCreature> | 
| Pick<T, K> | Creates a type with only the properties K from T | Pick<Potion, 'name' | 'effect'> | 
| Omit<T, K> | Creates a type without the properties K from T | Omit<SpellBook, 'secretSpell'> | 
| Readonly | Makes all properties in T read-only | Readonly<Wand> | 
| ReturnType | Extracts the return type of a function type T | ReturnType<typeof castSpell> | 
| Record<K, T> | Creates an object type with keys of type K and values of type T | Record<string, number> | 
| NonNullable | Creates a type by excluding null and undefined from T | NonNullable<MagicalItem> | 
И вот вы,年轻的巫师们! Теперь вы освоили базовые заклинания утилитарных типов TypeScript. Помните, как и любая магия, эти типы становятся более powerful с практикой. Так что продолжайте экспериментировать, и вскоре вы будете cast этих типов так же легко, как saying "Wingardium Leviosa"!
Credits: Image by storyset
