В последнее время я провожу МНОГО времени с JavaScript и заметил, что JS очень крутой. Он никогда не спрашивает меня, какой тип данных будет иметь моя переменная. Как он узнает, как запустить мою программу? Это кажется довольно большим упущением!
JavaScript — язык со слабой типизацией…
// JavaScript // Defining "fruit" as a variable const fruit; // Assigning "fruit" a string as its value fruit = “grapes”;
Сравните это с Java, примером строго типизированного языка…
// Java // Defining "fruit" as a string variable. String fruit; // Assigning "fruit" a value. fruit = “grapes”;
Java сразу узнает, если вы совершаете ошибку, не присваивая допустимое значение. Java также знает, когда вы пытаетесь использовать метод или функцию для переменной неправильного типа, и выдает вам ошибки. Он знает все это еще до того, как вам нужно будет запустить код!
Хорошая и плохая сторона JavaScript заключается в том, что мне не нужно тратить много времени на размышления и планирование кода на основе типов данных. (Об этом стоит беспокоиться Линде в будущем!) По мере того, как я пишу все более сложные программы и работаю с данными API, я все больше понимаю, что гибкость типов JS может быть палкой о двух концах. Его легче выучить, но иногда хотелось бы, чтобы он был немного строже.
Знает ли JavaScript тип моей переменной?
Короткий ответ — нет, но это и не нужно. В JavaScript используется утиная типизация (да, это реальный термин). Поскольку мы никогда не сообщаем JS, какого типа что-либо, он ВСЕГДА будет пробовать метод для переменной, чтобы увидеть, сработает ли он, каким бы глупым он ни был.
Таким образом, единственный способ найти ошибку — выполнить именно ту строку, в которой находится метод. В большинстве случаев это работает хорошо, но иногда мы получаем непредсказуемые результаты.
console.log(2 + true); // returns 3 // ¯\_(ツ)_/¯
Oh no!
Не беспокойтесь, существуют способы принудительного применения типов данных!
Преимущества? Программа будет знать во время компиляции, работает что-то или нет, и предупредит вас! Меньше времени тратится на отладку, если вы пишете меньше ошибок в программе!
- Используйте средство проверки статического типа
Статические средства проверки типов, такие как TypeScript или Flow, позволяют нам использовать статическую типизацию, то есть мы присваиваем тип данных переменной и не можем изменить свое решение позже. Теперь наш код знает, что мы делаем, поэтому мы получаем предупреждения перед компиляцией и во время компиляции.
В настоящее время TypeScript является наиболее популярным выбором. Angular 2 на самом деле написан на TypeScript и хорошо интегрирован с VSCode. TypeScript также является линтером (хорошо работает с ESLint) и транспайлером, который потенциально может заменить использование Babel.
Использование TypeScript делает код более читабельным. Вам напоминают о том, как использовать его, КАК вы его используете. Сравните это с прочесыванием плотной или плохо написанной документации, которая, скорее всего, уже устарела.
2. Используете Реакт? Попробуйте PropTypes!
PropTypes быстро настраивается в React. Вы можете использовать его для создания очень сложных проверок типов, как необязательных, так и обязательных.
Вот пример из документов React:
import PropTypes from 'prop-types';
class Greeting extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
Greeting.propTypes = {
name: PropTypes.string
};
Первые два варианта отлично подходят для сложных проектов. Но иногда вам не нужен дополнительный код и умственная нагрузка….
3. Средство проверки типов во время выполнения
Хороший легкий вариант, который работает без дополнительного синтаксиса, используйте Tern.js или другой плагин с проверкой типа во время выполнения. Он выдает предупреждения, определяя тип данных, из которого назначена переменная.
4. Ничего плохого в ванили 🍨
Иногда самый простой маршрут является лучшим. Возможно, вам нужна базовая проверка типов только в нескольких важных местах. Попробуйте объединить typeof
с оператором if
.
if (typeof var === “number”) { console.log("Great! Go ahead and run the code!"); } else { console.log("Oopsydoodle. Check your input!"); }
Вывод!
Начните думать о типах данных! Имея все эти доступные вам варианты проверки типов, можете ли вы придумать, в каких местах они могут помочь вам избежать ошибок типов?
Ресурсы, которые я использовал и рекомендую: