МАШИНОПИСЬ
Ошибки машинописного текста, когда вы пришли из внутреннего мира
Typescript растет так быстро, что избежать его невозможно. Независимо от того, используете ли вы его в своем приложении Angular, React, Vue или в своем бэкэнде, он значительно улучшает Javascript.
Он предлагает множество преимуществ, вытекающих из ООП (объектно-ориентированного программирования), однако у него есть некоторые недостатки, которые вы можете найти в статье Эрика Эллиотта:
Я начал использовать 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 на странице моего профиля.