If a type has ? in its definitions, it means that the property can be missing or undefined.
If a type has [] in its definitions, it means that the property is an array.
If a type has | in its definitions, it stands for OR and it means that the property can be either one of the types.
If a type has (...) in its definitions, it stands as a group.
If a type has [type] in its definitions, it means that it accepts any key that follows that type.
Examples
name?: string; means that name can be a string or missing/ or undefined.
names: string[]; means that names is an array of strings (["name1", "name2"]).
names: ("name1" | "name2")[]; means that names is an array that can contain either name1, name2 or both.
name: "hello" | "world" | "123"; means that name can either be hello, world or 123.
name: "example" | "types" | string; means that name can either be example, types or any other string.
[string]: string | null; means that the key is an object that accepts any key of type string and values string or number like {
"myString": "hello",
"something": "world",
"myNumber": 123,
"somethingElse": 456
}.