TypeScript был разработан компанией Microsoft как надстройка, или надмножество, JavaScript. При этом TypeScript считается отдельным языком программирования, поскольку имеет открытый код и очень быстро развивается. По популярности он уже догоняет JavaScript и входит в десятку самых используемых языков программирования в 2023 году по данным Statista.
Строгая, или статическая, типизация, — это свойство языков программирования, при котором тип каждой переменной, выражения или функции строго определен и не может изменяться во время выполнения программы. Строгая типизация отличается от динамической типизации, где типы проверяются во время выполнения и переменные могут менять свой тип.
Рассмотрим на примерах, как строгая типизация работает в TypeScript.
В TypeScript каждая переменная может быть объявлена с конкретным типом:
let userName: string = "Alice";
let userAge: number = 30;
let isActive: boolean = true;
Попытка присвоить переменной значение неверного типа приведет к ошибке компиляции:
userName = 25; // Ошибка: Type 'number' is not assignable to type 'string'.
В TypeScript можно указать типы для параметров функции и для ее возвращаемого значения:
function add(x: number, y: number): number {
return x + y;
}
Вызов функции с параметрами неправильных типов приведет к ошибке:
add("Hello", 5); // Ошибка: Argument of type 'string' is not assignable to parameter of type 'number'
Интерфейсы определяют структуру приложения, в которой классы имеют строго типизированные свойства и методы:
interface User {
name: string;
age: number;
}
function greet(user: User): string {
return `Hello, ${user.name}! You are ${user.age} years old.`;
}
const user: User = {
name: "Alice",
age: 30,
};
greet(user); // ОК
greet({ name: "Bob", age: "thirty" }); // Ошибка: Property 'age' is of type 'string' but expected 'number'.
В этом примере greet ожидает объект типа User, и передача объекта с неправильными типами свойств приведет к ошибке компиляции.
TypeScript и JavaScript поддерживают объектно-ориентированное программирование. Но в отличие от JavaScript TypeScript соответствует всем принципам ООП, например позволяет настраивать модификаторы доступа. Кроме того, вышеупомянутые интерфейсы позволяют типизировать классы.
interface IUser {
id: number; // Обязательное свойство
name: string; // Обязательное свойство
email?: string; // Необязательное свойство
}
function printUser(user: IUser) {
console.log(`User ID: ${user.id}, Name: ${user.name}`);
if (user.email) {
console.log(`Email: ${user.email}`);
}
}
const user: IUser = {
id: 1,
name: "John Doe",
email: "john.doe@example.com"
};
printUser(user);
В этом примере интерфейс IUser определяет структуру объекта с тремя свойствами: id, name и email, где email необязателен. Функция printUser принимает объект, соответствующий интерфейсу IUser, и выводит его свойства в консоль.
Объект user создается согласно определению интерфейса IUser и передается в функцию printUser.
Эти модификаторы помогают обеспечивать инкапсуляцию и безопасность данных. В TypeScript есть три основных модификатора доступа:
В будущем всё это может появиться и в JavaScript, но браузеры начнут поддерживать такие возможности еще очень нескоро.
Система типов TypeScript делает код более понятным. Можно легко понять, какие данные ожидает функция или что возвращает, просто взглянув на ее сигнатуру. Это особенно ценно в больших проектах и при работе в команде, где нужно понимать код других разработчиков.
Строгая типизация в TypeScript приводит к меньшему количеству ошибок. Она помогает обнаруживать их еще на этапе компиляции, т. е. до того, как код будет запущен. Таким образом, многие потенциальные проблемы и ошибки можно исправить заранее, что сокращает время на отладку и повышает качество кода.
Несмотря на его удобство, TypeScript нескоро сможет заменить JavaScript. Но если вы хотите строить карьеру фронтенд-разработчика, знание TypeScript поможет вам повысить квалификацию.