Зокрема, типізація там структурна. Тобто на відміну від C++ не треба наслідуватися від якихось конкретних типів — достатньо переконатися, що всі поля і їхні типи збігаються. Тому
type Foo = { a: string; b: number };
type Bar = { a: string; b: number };
const foo: Foo = { a: '42', b: 42 };
const bar: Bar = foo;працює без проблем. Ну й воно вміє там ті типи звужувати за потреби та ще багато чого робити.
Відповідно, щоб типізувати принаймні стандартну лібу 💻, типочкам довелося добряче спітніти. Проблема лише в тому, що відносно легко всі ці перевірки типів обійти: стратегічно розставлені ШІ-шкою
any та unknown ріжуть то все під корінь 😂 Але я поки по-дідівськи цією мовою кодю — руками.І робив оце функцію (React-компонент) для малювання певних даних у комірці таблиці. Вона очікує на вхід обʼєкт (рядок таблиці), з якого потім дістає ті дані з певних полів. Єдина проблема, що тип рядків може бути різним, бо воно до API підвʼязане. Дані там ті точно є, але поля не завжди називаються так, як треба. Вирішив зробити мапінг з одних на інші, щоб можна було писати щось типу:
type Params = { fieldA: number; fieldB: number } // те, шо мені треба
type Whatever = { megaFieldA: number; megaFieldB: number }; // якийсь інший тип
func(whateverObj, { fieldA: 'megaFieldA', fieldB: 'megaFieldB' });і тоді всередині я очікую
fieldA і fieldB, але діставатиму їх за іншими іменами.«Але було б прикольно це типізувати, щоб не відстрелити собі ногу» — подумав я (бо після C++ ніг не так щоб багато лишилося). І це дійсно можна там зробити!
type MyKeyMap<SourceType> = Partial<{
[K in keyof Params]: keyof SourceType;
}>;Тобто ми тут буквально пишемо, що маємо обʼєкт, ключі якого мають бути ключами
Params (з яким працює мій компонент), а значеннями — ключами SourceType (пофіг якого, бо це дженерік). Ну й Partial на всяк, щоб не обовʼязково було всі поля мапити, якщо імена збігаються. І компілятор такий чік-чік — перевірив. Тобто отой 'megaFieldA' вгорі може й виглядає як текстовий рядок, але по факту компілятор знає, що це назва поля в обʼєкті. Прикольно!До речі, C++-програмістам, які JS ніколи не вчили, а просто почали його використовувати в якомусь QML, запис з квадратними дужками на місті ключів здаватиметься дивним. Але насправді це звичайна фіча JS, коли треба зробити обʼєкт з ключем, який представлений не рядковим літералом, а виразом. Тобто замість:
let foo = {};
foo[someVal + 1] = 'blabla';можна написати просто
const foo = { [someVal + 1]: 'blabla' };Тому я завжди раджу книжки читати, навіть якщо здається, що мова не «основна».
Ну а щодо 🕸 не дивно, що він здобув таку популярність врешті, бо писати React на чистому JS просто неможливо. Це повна дупа була б.