W dużym skrócie:
any – nie sprawdzaj typów
unknown – nie wiadomo jaki to typ (trochę jak Object w Java)
Przykład 1 – przypisywanie wartości
any
let person: any = {name: string}; //bez problemu
unknown
let person: unknown = {name: string}; //także bez problemu
W obydwu przypadkach nie ma problemu aby przypisać dowolną wartość do zmiennej.
Przykład 2 – używanie pól/metod
any
let person: any = {};
person.name = 'David'; //bez problemu
person.sayHello(); //bez problemu
W przypadku any, typ nie jest w ogóle sprawdzany – możliwe jest przypisywanie dowolnych pól i wykorzystywanie dowolnych metod.
unknown
let person: unknown = {name: 'John', sayHello: () => console.log('test')};
person.name = 'David'; //błąd - typ zmiennej to unknown
person.sayHello(); //błąd - typ zmiennej to unknown
W przypadku typu unknown nie jest możliwe zarówno używanie pól jak i korzystanie z metod. Aby móc korzystać w pól/metod obiektu konieczne jest uprzednie rzutowanie:
let person: unknown = {name: 'John', sayHello: () => console.log('test')};
let castedPerson = person as {name: string, sayHello: () => void};
castedPerson.name = 'David'; //teraz, bez problemu
castedPerson.sayHello(); //teraz, bez problemu
Przykład 3 – przypisywanie do zmiennych
any
let anyVariable: any;
let textVariable: string;
anyVariable = textVarialbe; //bez problemu
textVarialbe = anyVariable; //bez problemu
W przypadku any, nie ma żadnego sprawdzania.
unknown
let unknownVariable: unknown;
let textVariable: string;
unknownVariable = textVarialbe; //bez problemu
textVarialbe = unknownVariable; //błąd - nie jest możliwe przypisanie typu bardziej ogólnego
W przypadku unknown – do zmiennej typu unknown można przypisać zmienną innego typu (jako że typ unknown jest swojego rodzaju typem nadrzędnym dla innych typów). Zaś jeśli chodzi o odwrotną sytuację – na przykład przypisanie do zmiennej typu string zmiennej typu unknown – nie jest to możliwe. Chodzi o to, że unknown jest typem bardziej ogólnym niż na przykład typ string.
Wykorzystanie unknown
Wydaje się, że przypadkiem użycia dla unknown będzie API, w którym chcemy wymusić na kliencie rzutowanie typu (w przypadku gdy sami nie znamy ostatecznego typu).