В последнее время я провожу МНОГО времени с 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!

Не беспокойтесь, существуют способы принудительного применения типов данных!

Преимущества? Программа будет знать во время компиляции, работает что-то или нет, и предупредит вас! Меньше времени тратится на отладку, если вы пишете меньше ошибок в программе!

  1. Используйте средство проверки статического типа

Статические средства проверки типов, такие как 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!");
}

Вывод!

Начните думать о типах данных! Имея все эти доступные вам варианты проверки типов, можете ли вы придумать, в каких местах они могут помочь вам избежать ошибок типов?

Ресурсы, которые я использовал и рекомендую: