# TypeScript `unknown` type ## Like `any`, all types are assignable to unknown ```ts= let value: unknown; value = true; // OK value = 42; // OK value = "Hello World"; // OK value = []; // OK value = {}; // OK value = Math.random; // OK value = null; // OK value = undefined; // OK value = new TypeError(); // OK value = Symbol("type"); // OK ``` ## What if assigning `unknown` to variables of other types ```ts= let value: unknown; let value1: unknown = value; // OK let value2: any = value; // OK let value3: boolean = value; // Error let value4: number = value; // Error let value5: string = value; // Error let value6: object = value; // Error let value7: any[] = value; // Error let value8: Function = value; // Error ``` ## Performing operations on `unknown` type value ```ts= let value: unknown; value.foo.bar; // Error value.trim(); // Error value(); // Error new value(); // Error value[0][1]; // Error ``` ## Need to narrow down before using ```ts= let isUnknown: unknown = 123; // Error: Type 'unknown' is not assignable to type 'number' let value: number = isUnknown; // After narrowing, PASS! if(typeof isUnknown === 'number'){ value = isUnknown } ``` ```ts= function stringifyForLogging(value: unknown): string { if (typeof value === "function") { // Within this branch, `value` has type `Function`, // so we can access the function's `name` property const functionName = value.name || "(anonymous)"; return `[function ${functionName}]`; } if (value instanceof Date) { // Within this branch, `value` has type `Date`, // so we can call the `toISOString` method return value.toISOString(); } return String(value); } ```