TypeScript uses a structural type system. What that means can be easily demonstrated using the following example:
class Person { name: string; } class City { name: string; } const x: City = new Person();
In languages like C#, this would not compile. These languages use a nominal type system. Based on the name, a Person
is not a City
. TypeScript uses a structural type system. Based on the structure of Person
and City
, these types are equal, as they both have a name
property. This fits well in the dynamic nature of JavaScript. It can, however, lead to some unexpected behavior, as the following would compile:
class Foo { } const f: Foo = 42;
Since Foo
does not have any properties, every value would be assignable to it. In cases were the structural behavior is not desired, you can add a brand, a property that adds type safety but does not exist at runtime:
class Foo { __fooBrand...