A generic constraint (T extends ...) restricts what types a generic parameter can be, so you can safely use certain properties or methods on it. Without a constraint, a generic could be anything, so you can't assume it has any members.
longestBad<T>(: T, : T) {
a. > b. ? a : b;
}
longest<T { : }>(: T, : T): T {
a. > b. ? a : b;
}
(, );
([, ], []);
(, );
