Какие знаешь типизаторы JavaScript

Ответ

TypeScript — самый популярный, добавляет статическую типизацию с поддержкой дженериков, интерфейсов, union-типов. Полная совместимость с JS.

Flow — разработан Facebook, легковесный, но менее популярный. Использует аннотации через комментарии.

Пример TypeScript:

interface User {
  id: number;
  name: string;
}

function greet(user: User): string {
  return `Hello, ${user.name}!`;
}

JSDoc — подход через комментарии, не требует компиляции, но менее строгий:

/**
 * @param {number} x
 * @returns {number}
 */
function double(x) {
  return x * 2;
}

PropTypes — для проверки типов пропсов в React, работает в runtime.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши типы заговорили. Ну ладно, раз уж начали, давайте разберёмся, кто тут главный по тарелочкам.

Так, первое и самое жирное — TypeScript. Это сейчас король, блядь, все его юзают. Он на JS сверху натягивает такую систему типов, что мама не горюй. Дженерики там, интерфейсы, union-типы — вся эта хуйня, которая заставляет тебя думать, что ты пишешь на нормальном языке, а не на этом веб-джаваскриптовом угадай-ка. И главное — он на 100% совместим с обычным JS, то есть твой старый говнокод не сгорит, ёпта. Вот смотри, как красивенько:

interface User {
  id: number;
  name: string;
}

function greet(user: User): string {
  return `Hello, ${user.name}!`;
}

Чисто, аккуратно, понятно. Типа, вот тебе пользователь, у него есть id (число) и name (строка). Функция greet принимает этого пользователя и возвращает строку. Попробуй передать ей что-то другое — получишь ошибку ещё до запуска, в рот меня чих-пых! Удобно же.

Дальше у нас Flow. Это такой скромняга от Facebook. Он тоже типы проверяет, но делает это как-то по-тихому, через аннотации в комментариях. Народ его не особо жалует, популярность — так себе. Лёгкий, да, но когда все вокруг на TypeScript орут, как сумасшедшие, на Flow как-то всем похуй.

А вот JSDoc — это вообще для ленивых, которые компиляторы всякие не хотят ставить. Всё в комментариях пишешь, типа так:

/**
 * @param {number} x
 * @returns {number}
 */
function double(x) {
  return x * 2;
}

Выглядит, конечно, как костыль из прошлого века, но работает. Строгости, понятное дело, как с козла молока, но хоть что-то. Runtime'ом не проверяется, это просто подсказки для твоего редактора, чтобы не тыкал пальцем в небо.

Ну и куда же без React, блядь. Для пропсов у них своя приблуда — PropTypes. Это чисто runtime проверка. Ты в компоненте указываешь, каких типов пропсы ждёшь, а React уже в браузере, когда всё работает, смотрит: ага, ты мне строку обещал, а я тебе число подсунул — получай предупреждение в консоль, пидарас шерстяной! Удобно для отлова косяков на живом проекте, но до компиляции он нихуя не дотягивает.

Вот и весь сказ. Выбирай, что душе угодно: мощь и строгость TypeScript, скромность Flow, костыльность JSDoc или runtime-надзирателя от React. Главное — не путай их в коде, а то получится такая каша, что волосы дыбом встанут.