TypeScript 3.0 'unknown' vs. 'any'

ТипScript 3.0 вводит unknown тип, согласно их вики:

unknown теперь является зарезервированным типом имени, так как теперь он является встроенным. В зависимости от вашего предполагаемого использования неизвестного вам может потребоваться полностью удалить объявление (в пользу вновь введенного неизвестного типа) или переименовать его в другое.

В чем разница между неизвестным и любым? Когда мы должны использовать unknown any?

Ответ 1

Вы можете больше узнать о unknown в PR или анонсе RC, но суть в этом:

[..] неизвестный, который является типом безопасного аналога любого. Все, что присваивается неизвестному, но неизвестно не присваивается ни чем, кроме самого себя, и любое без утверждения типа или сужения на основе потока управления. Аналогично, никакие операции не разрешены неизвестным без предварительного утверждения или сужения до более конкретного типа.

Несколько примеров:

let vAny : any = 10 ; // We can assign anthing to any
let vUnknown: unknown =  10; // We can assign anthing to unknown just like any 


let s1: string = vAny; // Any is assigable to anything 
let s2: string = vUnknown; // Invalid we can't assign vUnknown to any other type (without an explicit assertion)

vAny.mehtod(); // ok anything goes with any
vUnknown.mehtod(); // not ok, we don't know anything about this variable

Предлагаемое использование:

Часто бывает, что мы хотим описать наименее способный тип в TypeScript. Это полезно для API-интерфейсов, которые хотят сигнализировать "это может быть любое значение, поэтому вы должны выполнить некоторый тип проверки, прежде чем использовать его". Это заставляет пользователей безопасно просматривать возвращенные значения.

Ответ 2

Разница между неизвестной и любой описывается как:

Подобно any, любое значение присваивается unknown; однако, в отличие от any, вы не можете получить доступ к каким-либо свойствам по значениям с unknown типом, а также не можете вызвать/построить их. Кроме того, значения unknown типа могут быть назначены только unknown или any.

Чтобы ответить на ваш вопрос о том, когда следует использовать unknown по any:

Это полезно для API-интерфейсов, которые хотят сигнализировать "это может быть любое значение, поэтому вы должны выполнить некоторый тип проверки, прежде чем использовать его". Это заставляет пользователей безопасно просматривать возвращенные значения.

Взгляните на объявление TypeScript 3.0 на примеры проверки типов переменной unknown типа и более подробного объяснения.