Ответ
В JavaScript есть несколько способов типизации:
- JSDoc – аннотации в комментариях для подсказок IDE:
/**
* @param {string} name
* @returns {number}
*/
function getNameLength(name) {
return name.length;
}
- TypeScript – надмножество JS с статической типизацией:
interface User {
id: number;
name: string;
}
function greet(user: User): string {
return `Hello, ${user.name}`;
}
- PropTypes – проверка типов props в React:
import PropTypes from 'prop-types';
Component.propTypes = {
count: PropTypes.number.isRequired,
title: PropTypes.string
};
- Flow – статический анализатор типов от Facebook:
// @flow
function square(n: number): number {
return n * n;
}
- Ручные проверки (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 вызывает ебанистику.
Вот и весь сказ, блядь. Выбирай, что душе угодно: от простых комментариев до целой системы типов. Главное — не пускай это дело на самотёк, а то получишь пиздопроебибну в продакшене.