Typescript - замена строк в карте URL - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть такая карта:

const urlPaths = {
        "Signature": "signature/(signatureId)",
        "Rule": "signature/(signatureId)/rule/(ruleId)",
    };

У меня есть некоторые данные, которые входят в мой API, например:

aId: {
    signatureId: "999"
}

или

aId: {
    signatureId: "123",
    ruleId: "456"
}

Я хочу иметь возможность использовать эту карту, чтобы вернуть мне URL для подписи или правила, например:

"signature/999" или "signature/123/rule/456"

Я встречал регулярное выражение заменить , но интересно, могу ли я на самом деле использовать это в этом случае?

function createUrl(url, regex, aId){
   url.replace(regex,(id) => aId[id])
}

Не уверен, если это возможно / как это сделать, или мне нужно что-то еще?

Любые идеи приветствуются.

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Поскольку автор просит решение Typescript, здесь я предоставляю решение Typescript. Здесь не обязательно использовать регулярное выражение, поскольку string.replace также принимает строку в качестве шаблона.

interface AID {
  signatureId: string,
}

interface AIDWithRuleId extends AID {
  signatureId: string,
  ruleId: string,
}

interface UrlPaths {
  Signature: string,
    Rule: string,
}

enum ValuesToReplace {
  signatureId = '(signatureId)',
    ruleId = '(ruleId)'
}

class URLBuilder {
  private static urlPaths: UrlPaths = {
    Signature: `signature/${ValuesToReplace.signatureId}`, // or you can keep "signature/(signatureId)"
    Rule: `signature/${ValuesToReplace.signatureId}/rule/${ValuesToReplace.ruleId}`, // or you can keep "signature/(signatureId)/rule/(ruleId)"
  }


  static getSignatureUrl(data: AID): string {
    return this.urlPaths.Signature.replace(ValuesToReplace.signatureId, data.signatureId);
  }

  static getRuleUrl(data: AIDWithRuleId): string {
    return this.urlPaths.Rule
      .replace(ValuesToReplace.signatureId, data.signatureId)
      .replace(ValuesToReplace.ruleId, data.ruleId);
  }

}

let x1: AID = {
  signatureId: '1'
};
let x2: AIDWithRuleId = {
  signatureId: '1',
  ruleId: '1'
};

console.log(URLBuilder.getSignatureUrl(x1));
console.log(URLBuilder.getRuleUrl(x2));
console.log(URLBuilder.getSignatureUrl(x2));
1 голос
/ 09 апреля 2020

Не уверен, что RegExp является строго необходимым, поскольку шаблоны, которые вы хотите заменить, соответствуют именам ваших свойств. Вы могли бы сделать что-то вроде этого:

const urlPaths = {
  "Signature": "signature/(signatureId)",
  "Rule": "signature/(signatureId)/rule/(ruleId)",
};

const aId1 = {
    signatureId: "999"
};

const aId2 = {
  signatureId: "123",
  ruleId: "456"
};

const createUrl = (url, aId) => {
  let newUrl = url;
  Object.entries(aId).forEach(([key, value]) => {
    newUrl = newUrl.replace(`(${key})`, value);
  });
  return newUrl;
}

console.log(createUrl(urlPaths.Signature, aId1));
console.log(createUrl(urlPaths.Rule, aId2));

Если вы хотите использовать RegExp, вот пример того, как это может работать тоже

const urlPaths = {
  "Signature": "signature/(signatureId)",
  "Rule": "signature/(signatureId)/rule/(ruleId)",
};

const aId1 = {
    signatureId: "999"
};

const aId2 = {
  signatureId: "123",
  ruleId: "456"
};

const createUrlRegExp = (url, regexs, aId) => {
  let newUrl = url;
  const replacer = match => aId[match.slice(1, -1)]; // get rid of parentheses around match
  regexs.forEach(regex => {
    newUrl = newUrl.replace(regex, replacer)
  });
  return newUrl;
};

console.log(createUrlRegExp(urlPaths.Signature, [/\(signatureId\)/], aId1));
console.log(createUrlRegExp(urlPaths.Rule, [/\(signatureId\)/, /\(ruleId\)/], aId2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...