打字稿反应-对象可能为零

时间:2020-04-30 05:16:51

标签: javascript reactjs typescript

我是个超级新手,我被要求提供帮助来帮助撰写打字稿网站。目前我的match const返回的对象可能为“ null”。我尝试过将匹配常数设为null,但为了我的生命,我无法弄清楚如何解决此问题,以免出现此错误。任何帮助将不胜感激。

 case "text":
      return (
        <div>
          {" "}
          {note.text.map((content: string, idx: number) => {
            const result = [];
            const matches = content.match(
              /(.*?)(<a href=")?(https?|www)((".*?>.*?<\/a>)|[^\s>]?)*(.*?)/gi
            );

            if (!!matches) {
              matches.forEach((match) => {
                let link;
                if (/href="/i.test(match)) {
                  const url = match 
                    .match(/<a href="(.*?)(?=">)/i)[0]
                    .replace('<a href="', "");
                  const linkText = match
                    .match(/(?:<a href=".*?">)(.*)(?=<\/a>)/)[0]
                    .replace(/(?:<a href=".*?">)/i, "");
                  link = <a href={url}>{linkText}</a>;
                } else {
                  const url = match.match(/(https?|www)[^\s]*/gi).join("");
                  link = <a href={url}>{url}</a>;
                }

                const splitter = match.match(
                  /(<a href=")?(https?|www)[^\s]*(.*<\/a>)?/gi
                )[0];
                const paredPlainText = match.split(new RegExp(splitter));
                result.push(paredPlainText[0]);
                result.push(link);
                result.push(paredPlainText[1]);
              });
            } else {
              result.push(content);
            }

            return <p>{result}</p>;
          })}
        </div>
      );

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解您的问题,说明听起来有些混乱,但我相信您的意思是:

if (!!matches) {

对吗?

这会将匹配调用的结果(可以是带有结果或null的数组)转换为布尔值。只需使用

if (matches) {

而是检查真假表达式(null代表虚假结果)。

如果此答案不是您想要的,请在问题中添加更多说明。

答案 1 :(得分:0)

感谢大家的回应!这是我在!之后使用非空断言运算符.match的答案,如下所示:

case "text":
      return (
        <div>
          {" "}
          {note.text.map((content: string, idx: number) => {
            const result = [];
            const matches = content.match(
              /(.*?)(<a href=")?(https?|www)((".*?>.*?<\/a>)|[^\s>]?)*(.*?)/gi
            );

            if (!!matches) {
              matches.forEach((match) => {
                let link;
                if (/href="/i.test(match)) {
                  const url = match
                    .match(/<a href="(.*?)(?=">)/i)![0]
                    .replace('<a href="', "");
                  const linkText = match
                    .match(/(?:<a href=".*?">)(.*)(?=<\/a>)/)![0]
                    .replace(/(?:<a href=".*?">)/i, "");
                  link = <a href={url}>{linkText}</a>;
                } else {
                  const url = match.match(/(https?|www)[^\s]*/gi)!.join("");
                  link = <a href={url}>{url}</a>;
                }

                const splitter = match.match(
                  /(<a href=")?(https?|www)[^\s]*(.*<\/a>)?/gi
                )![0];
                const paredPlainText = match.split(new RegExp(splitter));
                result.push(paredPlainText[0]);
                result.push(link);
                result.push(paredPlainText[1]);

              });
            } else {
              result.push(content)
            }
            console.log(result);

            return <p>{result}</p>;
          })}
        </div>
      );