Branded types (also known as nominal types) are a way of creating new, distinct types in a programming language that are not interchangeable with other types, even if those types have the same underlying representation. In other words, branded types allow programmers to create new types that have the same structure as existing types, but that are considered distinct types by the compiler or interpreter.

The idea behind branded types is to provide a way to create types that are semantically meaningful in a particular context, without having to create new data structures or classes. For example, a programming language might have a built-in type for integers, but a programmer might want to create a distinct type for, say, the number of items in a shopping cart. By creating a branded type for shopping cart quantities, the programmer can ensure that the code is more readable and maintainable, and that the compiler can catch errors where shopping cart quantities are accidentally used in place of integers.

Branded types can be implemented in different ways depending on the programming language, but they typically involve attaching a unique identifier or tag to a value or object to indicate its type. This identifier is used by the compiler or interpreter to enforce type safety and prevent inappropriate conversions between types.