Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Typescript
/

Псевдонимы типов (Type Aliases)

Typescript: Псевдонимы типов (Type Aliases)

Представим программу, в которой есть объект пользователя. Этот объект используется повсеместно. В такой ситуации описание типа этого объекта будет повторяться в каждом определении функции:

function doSomething(user: { firstName: string, pointsCount: number }) {}
function doSomethingElse(user: { firstName: string, pointsCount: number }) {}
function doSomethingAnother(user: { firstName: string, pointsCount: number }) {}

Во-первых, здесь много дублирования. Во-вторых, значительно усложняется изменение структуры, так как придется руками править все места, где встречается это определение. В этом уроке разберем, как избежать таких проблем.

Задаем псевдоним типа

Чтобы не делать одну и ту же работу, TypeScript позволяет задавать псевдоним для составных типов. Так мы не будем повторяться:

type User = {
  firstName: string;
  pointsCount: number;
}

Теперь можно провести замену во всех функциях:

function doSomething(user: User) {
  // ...
}

Псевдоним — это не создание нового типа данных. Это способ сокращенно записать определение типа. Поэтому следующие примеры будут работать без проблем:

const user = {
  firstName: 'Mike',
  pointsCount: 1000,
};

// Оба вызова работают
doSomething(user);
doSomething({ firstName: 'Bob', pointsCount: 1800 });

При этом разработчики на TypeScript говорят «создал тип», а не «создал псевдоним типа». Поэтому в этом курсе мы будем придерживаться общепринятого формата.

Типы можно задавать для любых типов данных, например, для простых:

type SomeType = string;

А также для составных:

// union тип из трех возможных значений
type SomeType = string | number | null;

// Функция
type Countable = (coll: number[]) => number

Объекты и функции

Описание типа функции вне объекта и внутри отличается. Когда функция записывается самостоятельно, используется формат стрелочной функции:

type Countable = (coll: number[]) => number

Внутри типа, который описывает объект, формат меняется на используемый для обычных свойств:

type User = {
  firstName: string;
  pointsCount: number;
  count(coll: number[]): number;
}

Но это не касается колбеков, которые могут быть использованы внутри:

type User = {
  firstName: string;
  pointsCount: number;
  // Типы взяты для примера
  count(coll: (v: string) => string): number;
}

В этом уроке мы научились использовать псевдонимы типов. Также мы узнали, как задавать псевдоним для составных типов.

Задание

Реализуйте функцию getOlderUser(), которая принимает на вход двух пользователей и возвращает того, который старше. Если пользователи являются ровесниками, то возвращается null:

const user1 = { name: 'Petr', age: 8 };

Определите для пользователя псевдоним, чтобы не дублировать определение его типа в параметрах функции.

Коммерческий опыт и Трудоустройство

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс Typescript
/

Псевдонимы типов (Type Aliases)

Typescript: Псевдонимы типов (Type Aliases)

Представим программу, в которой есть объект пользователя. Этот объект используется повсеместно. В такой ситуации описание типа этого объекта будет повторяться в каждом определении функции:

function doSomething(user: { firstName: string, pointsCount: number }) {}
function doSomethingElse(user: { firstName: string, pointsCount: number }) {}
function doSomethingAnother(user: { firstName: string, pointsCount: number }) {}

Во-первых, здесь много дублирования. Во-вторых, значительно усложняется изменение структуры, так как придется руками править все места, где встречается это определение. В этом уроке разберем, как избежать таких проблем.

Задаем псевдоним типа

Чтобы не делать одну и ту же работу, TypeScript позволяет задавать псевдоним для составных типов. Так мы не будем повторяться:

type User = {
  firstName: string;
  pointsCount: number;
}

Теперь можно провести замену во всех функциях:

function doSomething(user: User) {
  // ...
}

Псевдоним — это не создание нового типа данных. Это способ сокращенно записать определение типа. Поэтому следующие примеры будут работать без проблем:

const user = {
  firstName: 'Mike',
  pointsCount: 1000,
};

// Оба вызова работают
doSomething(user);
doSomething({ firstName: 'Bob', pointsCount: 1800 });

При этом разработчики на TypeScript говорят «создал тип», а не «создал псевдоним типа». Поэтому в этом курсе мы будем придерживаться общепринятого формата.

Типы можно задавать для любых типов данных, например, для простых:

type SomeType = string;

А также для составных:

// union тип из трех возможных значений
type SomeType = string | number | null;

// Функция
type Countable = (coll: number[]) => number

Объекты и функции

Описание типа функции вне объекта и внутри отличается. Когда функция записывается самостоятельно, используется формат стрелочной функции:

type Countable = (coll: number[]) => number

Внутри типа, который описывает объект, формат меняется на используемый для обычных свойств:

type User = {
  firstName: string;
  pointsCount: number;
  count(coll: number[]): number;
}

Но это не касается колбеков, которые могут быть использованы внутри:

type User = {
  firstName: string;
  pointsCount: number;
  // Типы взяты для примера
  count(coll: (v: string) => string): number;
}

В этом уроке мы научились использовать псевдонимы типов. Также мы узнали, как задавать псевдоним для составных типов.

Задание

Реализуйте функцию getOlderUser(), которая принимает на вход двух пользователей и возвращает того, который старше. Если пользователи являются ровесниками, то возвращается null:

const user1 = { name: 'Petr', age: 8 };

Определите для пользователя псевдоним, чтобы не дублировать определение его типа в параметрах функции.

Коммерческий опыт и Трудоустройство

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
← ПредыдущийСледующий →
← ПредыдущийСледующий →
← ПредыдущийСледующий →

Ваше упражнение проверяется по этим тестам

import { expect, expectTypeOf, test } from 'vitest';

import getOlderUser, { type User } from './index';

test('function', () => {
  const user1 = {
    name: 'sem',
    age: 3,
  };

  const user2 = {
    name: 'inna',
    age: 5,
  };

  const user3 = {
    name: 'mika',
    age: 5,
  };

  expect(getOlderUser(user1, user2)).toEqual(user2);
  expect(getOlderUser(user2, user1)).toEqual(user2);

  expect(getOlderUser(user2, user3)).toBeNull();

  expectTypeOf(getOlderUser).returns.toExtend<User | null>();
});
← ПредыдущийСледующий →

Решение учителя откроется через:

20:00

waiting_clock
← ПредыдущийСледующий →