URLJoin
Joins all given URL segments together, then normalizes the resulting URL.
Use String.prototype.join('/') to combine URL segments, then a series of String.prototype.replace() calls with various regexps to normalize the resulting URL (remove double slashes, add proper slashes for protocol, remove slashes before parameters, combine parameters with '&' and normalize first parameter delimiter).
typescript
const URLJoin = (...args: string[]) =>
  args
    .join("/")
    .replace(/[\/]+/g, "/")
    .replace(/^(.+):\//, "$1://")
    .replace(/^file:/, "file:/")
    .replace(/\/(\?|&|#[^!])/g, "$1")
    .replace(/\?/g, "&")
    .replace("&", "?");
const URLJoinWithParams = (url: string, params: AnyObject<string | number>) => {
  return URLJoin(url, objectToQueryString(params));
};
typescript
URLJoin("http://www.google.com", "a", "/b/cd", "?foo=123", "?bar=foo"); // 'http://www.google.com/a/b/cd?foo=123&bar=foo'
URLJoinWithParams(URLJoin("http://www.google.com", "a", "/b/cd"), {
  foo: 123,
  bar: "foo",
}); // "http://www.google.com/a/b/cd?foo=123&bar=foo";