Кодовая база
1.27K subscribers
16 photos
1 video
32 links
База во фронтенд разработке.

Написать в личку: https://t.iss.one/devmargooo
Download Telegram
🍇 Немного о сортах типизации

Раз уж я заговорила про 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
🔥12💩8🤮6👍43👎2😁1🖕1