unknown
В уроке «Основные типы» вы познакомились с any, который отключает проверку типов: TypeScript разрешает всё, и баги JavaScript возвращаются. Но иногда вы и правда не знаете, что за значение перед вами. Данные, пришедшие извне, — сохранённая игра, файл, сообщение от сервера — могут содержать что угодно: возможно, ожидаемое число, возможно, строку, а возможно, вообще ничего.
Для таких значений в TypeScript есть тип unknown. Как и any, он принимает любое значение. Но в отличие от any, он не позволяет ничего делать со значением, пока вы не выясните, что это такое:
const savedName: unknown = "Кира";
console.log(savedName);
console.log(savedName.toUpperCase());main.ts(3,13): error TS18046: 'savedName' is of type 'unknown'.Вывод разрешён, потому что console.log принимает что угодно. А метод — нет: значение могло бы оказаться числом, и тогда программа упала бы. Нельзя и положить unknown в переменную другого типа: const heroName: string = savedName; даёт error TS2322: Type 'unknown' is not assignable to type 'string'.
К значению можно добраться, сузив его знакомыми вам проверками:
const savedName: unknown = "Кира";
if (typeof savedName === "string") {
console.log(savedName.toUpperCase());
} else {
console.log("В сохранении нет имени");
}Программа выведет:
КИРАВнутри if savedName — это string, и разрешено всё, что работает для строк. В этом и вся разница между двумя типами. С any можно забыть о проверке, и программа упадёт при запуске (для const savedName: any = 42; вызов закончится ошибкой TypeError: savedName.toUpperCase is not a function). С unknown забыть нельзя: TypeScript требует проверку.
Поэтому, если вы не знаете тип значения, пишите unknown, а не any. А увидев any в программе, спросите себя, не подойдёт ли настоящий тип или хотя бы unknown.
Задание
- 1
Программа выводит
130,4510,10и11. Второе число неверно: сохранённое золото было строкой"45", а"45" + 10даёт строку"4510". Проблему скрылany. Измените типsavedнаunknown, и TypeScript сообщит об ошибке вreturn. Исправьте функцию: еслиsaved— число, верните его; иначе пока возвращайте0. Тогда программа выведет130и три раза10. - 2
Добавьте ещё одну проверку: если
saved— строка, вернитеNumber(saved). Тогда программа выведет:130 55 10 10