TypeScript – any vs unknown

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).