Неизвестный
unknown — это супертип всех типов. Все значения являются unknown, но перед выполнением любых операций над значением unknown необходимо выполнить его уточнение.
unknown в Flow — это тот же самый верхний тип, что и unknown в TypeScript. Полное сравнение см. в разделе Обозначения типов в Flow и TypeScript.
Когда это использовать
Используйте unknown вместо any, когда нужно принимать произвольные значения: unknown требует выполнить уточнение перед использованием, поэтому его безопасно использовать с точки зрения типов. Если набор возможных типов известен заранее, для большей конкретики используйте объединение.
Обзор
В целом программы содержат несколько категорий типов:
Один тип:
Здесь входное значение может быть только number.
function square(n: number) {
return n * n;
} Группа различных возможных типов:
Здесь входное значение может быть либо string, либо number.
function stringifyBasicValue(value: string | number) {
return '' + value;
} Тип, основанный на другом типе:
Здесь возвращаемый тип будет совпадать с типом значения, переданного функции.
function identity<T>(value: T): T {
return value;
} Эти три категории типов встречаются чаще всего. Они составляют большую часть типов, которые вы будете создавать.
Однако есть и четвёртая категория.
Произвольный тип, которым может быть что угодно:
Здесь переданное значение имеет неизвестный тип: это может быть любой тип, и функция всё равно будет работать.
function getTypeOf(value: unknown): string {
return typeof value;
} Такие неизвестные типы встречаются реже, но иногда всё же полезны.
Для представления этих значений следует использовать unknown.
Принимается что угодно, но ничего не возвращается
unknown принимает значения любого типа. Подойдут строки, числа, объекты, функции — что угодно.
function stringify(value: unknown) {
// ...
}
stringify("foo");
stringify(3.14);
stringify(null);
stringify({}); При попытке использовать значение типа unknown сначала необходимо выяснить его фактический тип, иначе возникнет ошибка.
function stringify(value: unknown) {
return "" + value; // Error!
}
stringify("foo"); Вместо этого следует убедиться, что значение имеет определённый тип, выполнив его уточнение.
function stringify(value: unknown) {
if (typeof value === 'string') {
return "" + value; // Works!
} else {
return "";
}
}
stringify("foo"); Благодаря проверке typeof value === 'string' Flow знает, что внутри инструкции if значение value может быть только string. Это называется уточнением.
В сравнении с any
unknown безопасен, а any — нет. Оба типа принимают любые значения, но any также небезопасно разрешает любые операции.
В сравнении с empty
unknown — противоположность empty:
- Всё является
unknown, но до уточнения до конкретного типа над ним разрешено выполнять лишь несколько операций. Это супертип всех типов. - Ничто не является
empty, но над ним разрешены любые операции. Это подтип всех типов.
Уточнение unknown
typeof — наиболее распространённый способ сузить значение unknown (полный список форм см. в разделе «Уточнения»), но при работе с unknown также регулярно используются несколько других идиом.
Array.isArray
Сужает unknown до ReadonlyArray<unknown>. Элементы по-прежнему имеют тип unknown, и перед использованием их необходимо уточнить.
declare const value: unknown;
if (Array.isArray(value)) {
value as ReadonlyArray<unknown>; // OK
}
'key' in value
Оператор in требует, чтобы его правый операнд уже был ненулевым объектом, поэтому применение 'key' in value к простому значению типа unknown приводит к ошибке типа. Сначала сузьте тип до объекта; затем in уточнит значение до объекта с этим свойством (тип свойства — unknown, и перед использованием его нужно дополнительно уточнить):
declare const value: unknown;
if (typeof value === 'object' && value !== null && 'foo' in value) {
value as {readonly foo: unknown, ...}; // OK
} Шаг value !== null необходим, потому что typeof null === 'object'.
instanceof
value instanceof SomeClass сужает unknown до этого класса:
class User {
name: string = '';
}
declare const value: unknown;
if (value instanceof User) {
value.name as string; // OK
} См. также
-
Уточнения — как сузить значения
unknownдо конкретных типов перед использованием -
Иерархия типов — взаимосвязь
unknown,anyиemptyв полной иерархии типов -
Модернизация устаревшего синтаксиса Flow — переход с устаревшего типа
mixedнаunknown
© 2013–present Facebook Inc.
Licensed under the MIT License.
https://flow.org/en/docs/types/unknown