Typescript: Тип unknown
Использование типа any в TypeScript отключает проверки типов, что нежелательно. Также в наиболее строгом режиме с помощью "strict": true в tsconfig.json использование any невозможно. А это значительно повышает безопасность кода.
При этом бывают ситуации, когда тип неизвестен, но работа с ним должна быть безопасна с точки зрения типов. Для этого в TypeScript существует дополнение к any — unknown, которое разберем в этом уроке.
Использование типа unknown
Главное отличие unknown от any связано с проверкой типов. Тип unknown запрещает выполнять любые операции:
const value: unknown = "code-basics";
value.toUpperCase(); // Error!
value.trim(); // Error!Может показаться странным, что перед нами строка, но над ней нельзя выполнять строковые операции. К этому надо привыкнуть. Тип в статически типизированных языках определяется не тем, что мы видим своими глазами, а тем, как тип выводится — автоматически или через явное указание.
Переменная unknown типа нужна редко — когда нужно дальше уточнить тип. Но все меняется, когда нам нужно создать функцию, которая может работать с любым входящим типом. В JavaScript распространена подобная практика:
// Пример из lodash
_.isError(new Error()); // true
_.isError(Error); // false
_.isError("code-basics"); // falseТакую функцию можно реализовать с помощью any, но тогда мы отключим проверку типов:
function isError(value: any);Лучше использовать unknown, тогда TypeScript защитит от потенциальных ошибок типов:
function isError(value: unknown);Затем внутри тела можно выполнить нужную проверку, чтобы узнать, с чем мы работаем:
function isError(value: unknown): boolean {
return value instanceof Error;
}instanceof работает только с конструкторами, поэтому в примере выше мы проверяем, является ли значение экземпляром класса Error.
Задание
Реализуйте функцию isPlainObject(), которая проверяет, является ли переданное значение объектом. Эта функция считает, что массив не объект:
isPlainObject(1); // false
isPlainObject("hexlet"); // false
isPlainObject({}); // true
isPlainObject({ name: "code-basics" }); // true
isPlainObject([1, 8]); // falseTypescript: Тип unknown
Использование типа any в TypeScript отключает проверки типов, что нежелательно. Также в наиболее строгом режиме с помощью "strict": true в tsconfig.json использование any невозможно. А это значительно повышает безопасность кода.
При этом бывают ситуации, когда тип неизвестен, но работа с ним должна быть безопасна с точки зрения типов. Для этого в TypeScript существует дополнение к any — unknown, которое разберем в этом уроке.
Использование типа unknown
Главное отличие unknown от any связано с проверкой типов. Тип unknown запрещает выполнять любые операции:
const value: unknown = "code-basics";
value.toUpperCase(); // Error!
value.trim(); // Error!Может показаться странным, что перед нами строка, но над ней нельзя выполнять строковые операции. К этому надо привыкнуть. Тип в статически типизированных языках определяется не тем, что мы видим своими глазами, а тем, как тип выводится — автоматически или через явное указание.
Переменная unknown типа нужна редко — когда нужно дальше уточнить тип. Но все меняется, когда нам нужно создать функцию, которая может работать с любым входящим типом. В JavaScript распространена подобная практика:
// Пример из lodash
_.isError(new Error()); // true
_.isError(Error); // false
_.isError("code-basics"); // falseТакую функцию можно реализовать с помощью any, но тогда мы отключим проверку типов:
function isError(value: any);Лучше использовать unknown, тогда TypeScript защитит от потенциальных ошибок типов:
function isError(value: unknown);Затем внутри тела можно выполнить нужную проверку, чтобы узнать, с чем мы работаем:
function isError(value: unknown): boolean {
return value instanceof Error;
}instanceof работает только с конструкторами, поэтому в примере выше мы проверяем, является ли значение экземпляром класса Error.
Задание
Реализуйте функцию isPlainObject(), которая проверяет, является ли переданное значение объектом. Эта функция считает, что массив не объект:
isPlainObject(1); // false
isPlainObject("hexlet"); // false
isPlainObject({}); // true
isPlainObject({ name: "code-basics" }); // true
isPlainObject([1, 8]); // falseВаше упражнение проверяется по этим тестам
import { expect, test } from "vitest";
import isPlainObject from "./index";
test("function", () => {
expect(isPlainObject(3)).toBe(false);
expect(isPlainObject("hexlet")).toBe(false);
expect(isPlainObject({})).toBe(true);
expect(isPlainObject([])).toBe(false);
});Решение учителя откроется через:
20:00
