TS function overload

Type narrowing with overload As a return type from reverse function we can expect narrowed types.

⚠️But be careful when typing return type of overloaded function, make sure that it does match actual implementation. Because wrong return type will not cause a compile time error

//⚠️returning string will not cause error and treat array as string ⚠️
function reverse<T>(array: readonly T[]): string;
function reverse(string: string): string;
function reverse<T>(array: readonly T[]): T[];
function reverse(stringOrArray: string | readonly unknown[]) {
  return typeof stringOrArray === "string"
    ? [...stringOrArray].reverse().join("")
    : stringOrArray.slice().reverse();

//⚠️ const reversedString: string
const reversedString = reverse("hello");

//⚠️ const reversedArray: number[]
const reversedArray = reverse([1, 2, 3, 4, 5]);