JavaRush /Курсы /Модуль 2: Fullstack /Типы any и unknown

Типы any и unknown

Модуль 2: Fullstack
4 уровень , 7 лекция
Открыта

8.1 Тип any

Иногда возникают ситуации, когда невозможно заранее определить тип данных. В таких случаях могут быть полезны типы any и unknown. Сейчас мы подробно рассмотрим, когда и как использовать эти типы, а также их основные различия.

Тип any в TypeScript позволяет отключить проверку типов для переменной, давая ей возможность принимать значения любого типа. Это похоже на использование динамической типизации в JavaScript.

Особенности типа any

  1. Гибкость: переменная типа any может принимать значения любого типа без ограничений.
  2. Отключение проверки типов: компилятор TypeScript не будет выполнять проверку типов для переменной типа any.
  3. Потенциальные риски: из-за отсутствия проверки типов можно случайно допустить ошибки, которые будут обнаружены только на этапе выполнения.

Рассмотрим примеры использования типа any.

Пример 1: Переменные и тип any

JavaScript
    
      "use strict";
      let value;
      value = 'Hello';
      value = 42;
      value = true;
      console.log(value); // Вывод: true
    
  
TypeScript
    
      let value: any;
      value = 'Hello';
      value = 42;
      value = true;

      console.log(value); // Вывод: true
    
  

В этом примере переменная value может принимать значения любых типов.

Пример 2: Функции и тип any

JavaScript
    
      "use strict";
      function processInput(input) {
          console.log(`Processing: ${input}`);
      }
      processInput('Hello'); // Hello
      processInput(42); // 42
      processInput({ name: 'Alice' }); // [object Object]
    
  
TypeScript
    
      function processInput(input: any): void {
        console.log(`Processing: ${input}`);
      }

      processInput('Hello'); // Hello
      processInput(42); // 42
      processInput({ name: 'Alice' }); // [object Object]
    
  

В этом примере функция processInput принимает аргумент типа any, что позволяет ей обрабатывать значения любых типов.

Пример 3: Работа с внешними библиотеками

Тип any может быть полезен при работе с внешними библиотеками, для которых нет типов или они слабо типизированы.

TypeScript
    
      declare function getExternalData(): any;

      let data = getExternalData();
      console.log(data);
    
  

В этом примере функция getExternalData возвращает значение типа any, так как точный тип данных неизвестен.

8.2 Тип unknown

Тип unknown был введен в TypeScript 3.0 и является более безопасной альтернативой типу any. Он также позволяет переменной принимать значения любого типа, но с одной важной разницей: необходимо явно проверять тип переменной перед тем, как использовать ее.

Особенности типа unknown

  1. Гибкость: переменная типа unknown может принимать значения любого типа.
  2. Строгая проверка типов: перед использованием переменной типа unknown необходимо выполнить проверку типа, что помогает избежать ошибок.
  3. Безопасность: тип unknown обеспечивает более строгую проверку типов по сравнению с any.

Рассмотрим примеры использования типа unknown.

Пример 1: Переменные и тип unknown

JavaScript
    
      "use strict";
      let value;
      value = 'Hello';
      value = 42;
      value = true;
      if (typeof value === 'string') {
        console.log(value.toUpperCase()); // Не выведется
      }  else {
        console.log("value isn't string! value type is: " + typeof value);
      }
    
  
TypeScript
    
      let value: unknown;
      value = 'Hello';
      value = 42;
      value = true;

      if (typeof value === 'string') {
        console.log(value.toUpperCase()); // Не выведется
      } else {
        console.log("value isn't string! value type is: " + typeof value);
      }
    
  

В этом примере переменная value может принимать значения любых типов, но перед использованием необходимо выполнить проверку типа.

Пример 2: Функции и тип unknown

JavaScript
    
      "use strict";
      function processInput(input) {
          if (typeof input === 'string') {
              console.log(`String input: ${input.toUpperCase()}`);
          }
          else if (typeof input === 'number') {
              console.log(`Number input: ${input.toFixed(2)}`);
          }
          else {
              console.log('Unknown input type');
          }
      }
      processInput('Hello'); // HELLO
      processInput(42); // 42
      processInput({ name: 'Alice' }); // Unknown input type
    
  
TypeScript
    
      function processInput(input: unknown): void {
        if (typeof input === 'string') {
          console.log(`String input: ${input.toUpperCase()}`);
        } else if (typeof input === 'number') {
          console.log(`Number input: ${input.toFixed(2)}`);
        } else {
          console.log('Unknown input type');
        }
      }

      processInput('Hello'); // HELLO
      processInput(42); // 42
      processInput({ name: 'Alice' }); // Unknown input type
    
  

В этом примере функция processInput принимает аргумент типа unknown и выполняет проверку типа перед его использованием.

Пример 3: Обработка данных из API

Тип unknown может быть полезен при обработке данных из API, где тип данных может быть неизвестен.

JavaScript
    
      "use strict";
      async function fetchData(url) {
          let response = await fetch(url);
          let data = await response.json();
          return data;
      }
      async function processData() {
          let data = await fetchData('https://jsonplaceholder.typicode.com/todos/1');
          if (Array.isArray(data)) {
              console.log('Received an array');
          }
          else if (typeof data === 'object' && data !== null) {
              console.log('Received an object');
          }
          else {
              console.log('Received unknown data type');
          }
      }
      processData();
    
  
TypeScript
    
      async function fetchData(url: string): Promise<unknown> {
        let response = await fetch(url);
        let data = await response.json();
        return data;
      }

      async function processData() {
        let data: unknown = await fetchData('https://jsonplaceholder.typicode.com/todos/1');

        if (Array.isArray(data)) {
          console.log('Received an array');
        } else if (typeof data === 'object' && data !== null) {
          console.log('Received an object');
        } else {
          console.log('Received unknown data type');
        }
      }

      processData();
    
  

В этом примере функция fetchData возвращает значение типа unknown, и перед использованием данных выполняется проверка типа.

8.3 Сравнение типа any и unknown

Основные различия между any и unknown

  1. Проверка типов:
    • any: отключает проверку типов, что может привести к ошибкам на этапе выполнения
    • unknown: требует явной проверки типа перед использованием, обеспечивая более строгую типизацию и безопасность
  2. Использование:
    • any: используется, когда необходимо быстро отключить проверку типов или при работе с динамическими данными, для которых точный тип неизвестен
    • unknown: предпочтителен, когда тип данных неизвестен, но требуется дополнительная проверка типа для обеспечения безопасности
  3. Безопасность:
    • any: менее безопасен, так как отсутствие проверки типов может привести к ошибкам
    • unknown: более безопасен, так как требует явной проверки типа перед использованием данных

Когда использовать any и unknown

  1. Используйте any, если:
    • вы работаете с кодом, где типы данных могут быть сильно изменены, и вы точно знаете, что типизация не важна
    • вам нужно быстро отключить проверку типов, например, при миграции существующего JavaScript кода на TypeScript
    • вы работаете с внешними библиотеками или API, для которых нет определений типов
  2. Используйте unknown, если:
    • вы хотите обеспечить максимальную безопасность типов и избежать ошибок на этапе выполнения
    • тип данных неизвестен на момент написания кода, но вы планируете выполнить проверку типа перед использованием данных
    • вы обрабатываете данные из внешних источников, таких как API, где тип данных может быть неизвестен заранее
3
Задача
Модуль 2: Fullstack, 4 уровень, 7 лекция
Недоступна
Работа с типом any
Работа с типом any
3
Задача
Модуль 2: Fullstack, 4 уровень, 7 лекция
Недоступна
Использование типа unknown с проверкой
Использование типа unknown с проверкой
3
Задача
Модуль 2: Fullstack, 4 уровень, 7 лекция
Недоступна
Работа с данными из API с типом unknown
Работа с данными из API с типом unknown
3
Задача
Модуль 2: Fullstack, 4 уровень, 7 лекция
Недоступна
Сравнение any и unknown
Сравнение any и unknown
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ