МАШИНОПИСЬ

Ошибки машинописного текста, когда вы пришли из внутреннего мира

Typescript растет так быстро, что избежать его невозможно. Независимо от того, используете ли вы его в своем приложении Angular, React, Vue или в своем бэкэнде, он значительно улучшает Javascript.

Он предлагает множество преимуществ, вытекающих из ООП (объектно-ориентированного программирования), однако у него есть некоторые недостатки, которые вы можете найти в статье Эрика Эллиотта:



Налог на TypeScript
Анализ затрат и выгодmedium.com



Я начал использовать Typescript более 2 лет назад. Думаю, как и многие бэкенд-разработчики, я не хотел пропустить волну.

В этой статье собраны все распространенные модели поведения, структуры данных и советы по программированию, используемые в серверных технологиях, таких как Java или C#. Конечно, я постараюсь, чтобы эта статья была как можно более актуальной. Не стесняйтесь участвовать, комментируя (замечания, ошибки или советы), и я упомяну вас.

Методы перегрузки

Перегрузка метода означает воздействие одним и тем же именем на несколько функций, отличающихся своими параметрами.

В C# это довольно просто:

public string SayHello() {
  return "Hello World!";
}
public string SayHello(string firstName, string lastName) {
  return $"Hello {firstName} {lastName}!";
}

Но как насчет машинописного текста? Это не так тривиально, мы должны проверить параметры:

sayHello(): string;
sayHello(firstName: string, lastName: string): string {
  if(firstName && lastName) { 
    return `Hello ${firstName} ${lastName}`;
  } else {
    return 'Hello World!';
  }
}

На этапе подъема сканируются все имена функций. Поскольку параметры функции не имеют отношения к различению двух методов (из-за динамической типизации в Javascript), их нельзя использовать. Поэтому нам нужно проверить параметры (предусмотрены ли они или нет) и их тип.

Совет.вы можете проверить тип параметра с помощью ключевых слов typeof (примитивы) или instanceof (сложные типы). Вы также можете использовать защиту типа.

Когда интерфейсы просто пусты

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

В C# принято ставить перед интерфейсами префикс I, например, IDisposable. В Typescript это не обязательно.

Благодаря интерфейсам вы можете расширять классы, объекты, другие интерфейсы. И о…

… расширение существующего объекта

Иногда вам просто нужно добавить методы к существующему объекту. Это удобный способ расширить возможности этого объекта.

In C#:

public static string AppendSmiley(this string message) {
  return $"{message} :-)";
}
string msg = "Home, sweet home!".AppendSmiley();
// Now msg equals "Home, sweet home! :-)"

В Typescript нам просто нужно помнить, что 2 интерфейса могут иметь одно и то же имя:

declare global {
  interface String {
    sayHello(): String;
  }
}
String.prototype.sayHello = function(): string {
  return 'Hello World!';
}
export{};

Картографические данные

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

В C# существует объект Dictionary‹TKey, TValue› (doc):

var dico = new Dictionary<int, string>();
dico.Add(1, "One");
dico.Add(2, "Two");
dico.Add(3, "Three");
dico.ContainsKey(2); // true

Typescript предоставляет набор служебных типов, включая тип Record, который ведет себя точно так же, как Dictionary в C#:

// Extract from doc
interface PageInfo {
    title: string;
}

type Page = 'home' | 'about' | 'contact';

const x: Record<Page, PageInfo> = {
    about: { title: 'about' },
    contact: { title: 'contact' },
    home: { title: 'home' },
}; 

Вы найдете все доступные типы утилит по следующему адресу:



Опустить тип в литералах

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

В этом смысле у нас есть класс Filter, в котором свойство формата доступно только для чтения. Если мы хотим, чтобы все редактируемые ключи фильтра использовали их в следующем методе: updateFilters(key: EditableFilters, newValue: unknown), нам нужно «опустить» свойство формата.

Действительно, keyof вернет все свойства. Этот трюк очень полезен в зависимости от контекста, но он работает только в более новой версии Typescript (3.5+). Если вы хотите использовать его для более старых версий, вы можете использовать обходной путь:

Pick<T, Exclude<keyof T, K>>

Как было предложено в начале, не стесняйтесь комментировать, чтобы сделать эту статью лучше. Вы можете найти другие статьи о Typescript на странице моего профиля.