🍇 Немного о сортах типизации
Раз уж я заговорила про typescript, считаю своим долгом погрузить вас в эту тему.
Как вы знаете, typescript - это компилируемый язык со статической типизацией. В статически типизируемых языках в переменную можно присвоить только значение сопоставимого типа:
Однако не все знают, что языки программирования имеют разный взгляд на то, какой же тип является “сопоставимым”. Бывают языки с номинативной и структурной типизацией.
☄ Номинативная типизация
Языки с номинативной типизацией используют имя типа для того, чтобы считать, что тип является сопоставимым. Так типизация работает в Java: если мы объявляем значение и указываем тип, то присвоить в это значение мы можем только этот же самый тип либо потомок (логически, потомок тоже является тем же самым типом, просто с некоторыми уточнениями).
Если у нас есть другой класс, который совпадает по структуре, но не является наследником, присвоить его нельзя:
🚀 Структурная типизация
К удивлению всех бекендеров, которые заглядывали в мой код, typescript работает совсем не так. В typescript структурная типизация, поэтому он проверяет структуру, то есть содержание полей:
Typescript-у не важно, что тип по-другому называется - ему главное, что нужные поля имеются. Это может подкинуть вам такой неприятный сюрприз:
В typescript можно эмулировать номинативную типизацию при помощикостыля хака, о котором я писала здесь. В остальных случаях придется к ней привыкнуть и полюбить ❤️
#typescript
Раз уж я заговорила про typescript, считаю своим долгом погрузить вас в эту тему.
Как вы знаете, typescript - это компилируемый язык со статической типизацией. В статически типизируемых языках в переменную можно присвоить только значение сопоставимого типа:
const x: number = 42; // ок, в number можно присвоить number
const y: number = ‘abc’; // ошибка, в number нельзя присвоить строку
Однако не все знают, что языки программирования имеют разный взгляд на то, какой же тип является “сопоставимым”. Бывают языки с номинативной и структурной типизацией.
Языки с номинативной типизацией используют имя типа для того, чтобы считать, что тип является сопоставимым. Так типизация работает в Java: если мы объявляем значение и указываем тип, то присвоить в это значение мы можем только этот же самый тип либо потомок (логически, потомок тоже является тем же самым типом, просто с некоторыми уточнениями).
class Order { public String id; }
// PriorityOrder технически тоже является Order-ом, просто с дополнительными свойствами
class PriorityOrder extends Order { }
public class Main {
public static void main(String[] args) {
// ок, присваиваем в Order значение типа Order
Order o1 = new Order();
// PriorityOrder тоже можно присвоить в переменную типа Order, так это наследник
Order o2 = new PriorityOrder();
}
}Если у нас есть другой класс, который совпадает по структуре, но не является наследником, присвоить его нельзя:
class CustomerRequest { public String id; }
public class Main {
public static void main(String[] args) {
// Ошибка: нельзя присвоить в Order значение типа CustomerRequest, они никак не связаны через наследование
Order o3 = new CustomerRequest();
}
}К удивлению всех бекендеров, которые заглядывали в мой код, typescript работает совсем не так. В typescript структурная типизация, поэтому он проверяет структуру, то есть содержание полей:
type Order = { id: string };
type CustomerRequest = { id: string };
Function handleOrder(order: Order) {…};
сonst customerRequest: CustomerRequest = { id: ‘abc’ };
// ок, потому что структура двух типов совпадает
handleOrder(customerRequest);
Typescript-у не важно, что тип по-другому называется - ему главное, что нужные поля имеются. Это может подкинуть вам такой неприятный сюрприз:
type Phone = string;
type Email = string;
function sendSms(phone: Phone) {...}
const email: Email = '[email protected]';
sendSms(email); // oк, потому что структура одна и та же, оба типа - строки
В typescript можно эмулировать номинативную типизацию при помощи
#typescript
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Фронтенд кухня🥘
Брендированные типы в typescript
Привет, с вами снова @devmargooo и сегодня мы с вами поговорим о типизации в приложении на typescript. Структурная типизация в typescript, в отличие от номинативной, определяет совместимость типов, основываясь не на названии…
Привет, с вами снова @devmargooo и сегодня мы с вами поговорим о типизации в приложении на typescript. Структурная типизация в typescript, в отличие от номинативной, определяет совместимость типов, основываясь не на названии…
🔥12💩8🤮6👍4❤3👎2😁1🖕1