TGViewer
Сіпласпластик Сіпласпластик @cpplastic · 739 subscribers
Post #499 981
Пишу останні пару місяців на TypeScript. Доволі цікаво, як ця мова розвивалася. Якщо в тому ж Dart сіли й зробили нормальну й «звичну» типізацію, то в TS взяли JavaScript, який забагато всього дозволяє, і спробували це типізувати.

Зокрема, типізація там структурна. Тобто на відміну від 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 просто неможливо. Це повна дупа була б.
  • 👍 23
  • 💊 1
More from @cpplastic
  1. Oct 7, 2026Post #543
  2. Oct 2, 2026Щось не злетіло з self-driving cars у автовиробників, еге ж? А стільки галасу було. Ну зат…
  3. Sep 24, 2026Ух, яку ж класну доповідь подивився: «Scott Jenson: Are we really going to use the same De…
  4. Sep 23, 2026Post #540
  5. Sep 21, 2026«Порекламую» вам український сайт, який мені дуже подобається. Взяв слово в лапки, бо як і…
  6. Sep 18, 2026Ви ж знаєте, що я полюбляю Tailscale 💠 попри те, що недоліків у них теж вистачає? Але сам…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →