Какие знаешь способы типизации в JS

Ответ

В JavaScript есть несколько способов типизации:

  1. JSDoc – аннотации в комментариях для подсказок IDE:
/**
 * @param {string} name
 * @returns {number}
 */
function getNameLength(name) {
  return name.length;
}
  1. TypeScript – надмножество JS с статической типизацией:
interface User {
  id: number;
  name: string;
}

function greet(user: User): string {
  return `Hello, ${user.name}`;
}
  1. PropTypes – проверка типов props в React:
import PropTypes from 'prop-types';

Component.propTypes = {
  count: PropTypes.number.isRequired,
  title: PropTypes.string
};
  1. Flow – статический анализатор типов от Facebook:
// @flow
function square(n: number): number {
  return n * n;
}
  1. Ручные проверки (type guards):
function isString(value) {
  return typeof value === 'string';
}

Ответ 18+ 🔞

А, ну вот, опять про эти ваши типы в JavaScript, блядь! Сидишь такой, пишешь код, а потом — бац! — и получаешь undefined is not a function прямо в ебало. Так, слушай, давай разберемся, как от этого говна спасаться, а то терпения ноль ебать уже.

Первое, что придумали эти умники, — JSDoc. Это когда ты в комментариях пишешь, что куда должно приходить, а IDE тебе подсказывает. Типа так:

/**
 * @param {string} name — сюда, блядь, строку передавай, а не свою рожу!
 * @returns {number} — а вернет тебе, хитрая жопа, циферку.
 */
function getNameLength(name) {
  return name.length;
}

Выглядит как обычные комментарии, но для редактора — святое. Хуй с горы, конечно, но хоть что-то.

Дальше — TypeScript, ёпта! Вот это уже серьёзно. Надмножество, блядь, целое. Тут ты прямо в коде пишешь, что вот это — строка, а вот это — объект с такими-то полями. И если накосячил — компилятор тебя ещё до запуска ебальником об стол выложит.

interface User {
  id: number; // цифра, Карл!
  name: string; // а это текст, ёбана!
}

function greet(user: User): string {
  return `Здарова, ${user.name}, пидорас шерстяной!`;
}

Красота, да? Но учить его надо, это не хухры-мухры.

А в React раньше (да и сейчас иногда) юзали PropTypes. Это такая проверка пропсов, прямо в рантайме. Накосячил с типом — в консоли тебе красненьким намекнут, что ты мудак.

import PropTypes from 'prop-types';

Component.propTypes = {
  count: PropTypes.number.isRequired, // обязательная циферка, иначе пиздец
  title: PropTypes.string // а это строка, можно и не передавать
};

Простенько, но душевно.

Ещё есть Flow от Facebook. Ну, это типа как TypeScript, но другой. Тоже статический анализ, тоже аннотации. Многие его хуями кроют, но он живой, блядь!

// @flow
function square(n: number): number {
  return n * n; // а если не число передашь — сам от себя охуеешь
}

И, наконец, классика жанра — ручные проверки, они же type guards. Когда ты сам, своей рукой, в коде проверяешь, что за хуйню тебе передали.

function isString(value) {
  return typeof value === 'string'; // если не строка — иди нахуй
}

Туповато? Да. Надёжно? Абсолютно. Иногда проще один раз проверить, чем потом всю ночь дебажить, почему у тебя null.length вызывает ебанистику.

Вот и весь сказ, блядь. Выбирай, что душе угодно: от простых комментариев до целой системы типов. Главное — не пускай это дело на самотёк, а то получишь пиздопроебибну в продакшене.