TypeScript has two concepts: type annotations and type inference. Type annotations involve explicitly specifying the type of a parameter or variable, while type inference occurs when TypeScript automatically determines the type based on the implementation.
TypeScript has a structural type system, which means that types are compatible based on their shape or structure rather than their names. This allows you to interchangeably use types with different names but identical properties. You can assign one type to another if they share the same properties, including optional properties.
TypeScript 4.9 introduces the "satisfies" operator, which allows us to verify that the type of an expression matches a specific type. This operator can be used to narrow down a union type and provide more precise type checking. In the example given, the "satisfies" operator is used to restrict the keys and values of a record type.
The `noUncheckedIndexedAccess` compiler option in TypeScript helps catch potential errors when accessing arrays or tuples with undefined or out-of-bounds indices. Enabling this option ensures that developers handle cases where indexed accesses can result in undefined values.