类型'null'必须具有'[Symbol.iterator]()'方法

时间:2019-02-23 09:22:55

标签: typescript

下面我有一个函数,该函数接受数字值并将其解析为货币值,例如11k,1m等。它可以完成任务,但是我在此行上收到ts错误:

const [match] = `${value / divider}`.match(regx);

错误

  

类型'null'必须具有'Symbol.iterator'方法,该方法返回   iterator.ts(2488)

完整代码

export function getCurrencyValue(value: number) {
  const ranges = [{ divider: 1e6, suffix: 'm' }, { divider: 1e3, suffix: 'k' }];
  const regx = new RegExp('^-?\\d+(?:.\\d{0,1})?');
  let formatedValue = '';

  ranges.forEach(range => {
    const { divider, suffix } = range;

    if (value >= divider) {
      const [match] = `${value / divider}`.match(regx);

      if (match) {
        formatedValue = `${match}${suffix}`;
      }
    }
  });

  return formatedValue || value;
}

1 个答案:

答案 0 :(得分:3)

您无法破坏null,所以

const [match] = `${value / divider}`.match(regx);

...如果没有匹配项,则会抛出,因为match在没有匹配项时返回null。您需要将其分为两个语句,或使用|| []技巧或类似方法。查看您的完整代码,似乎在这里似乎不需要解构(因为可能null),只需:

const match = `${value / divider}`.match(regx);

if (match) {
  formatedValue = `${match[0]}${suffix}`;
}

错误消息说明其原因的原因是,您正在执行的销毁类型(使用[])依赖于从正在销毁的事物中获取迭代器({{1}的结果) }。您可以使用match方法从某事物中获得一个迭代器:

Symbol.iterator

由于const it = `${value / divider}`.match(regx)[Symbol.iterator](); 可以返回的一件事是match,而null没有(也不能拥有)null属性,所以TypeScript抱怨它


旁注:Symbol.iterator在这里似乎不是正确的工具,因为您想在第一次获得比赛时就停止比赛。现在,您将为forEach范围写入formattedValue,但是随后将其格式化为1e6范围。

1e3是一个不错的选择:

for-of

为了清楚起见,我可能还会使用文字正则表达式语法(不必两次转义反斜杠),并将export function getCurrencyValue(value: number) { const ranges = [{ divider: 1e6, suffix: 'm' }, { divider: 1e3, suffix: 'k' }]; const regx = new RegExp('^-?\\d+(?:.\\d{0,1})?'); for (const { divider, suffix } of ranges) { if (value >= divider) { const match = `${value / divider}`.match(regx); if (match) { return `${match[0]}${suffix}`; } } }); return String(value); // Presumably you always want it to be a string } ranges都移到函数外,这样就不会每次都重新创建一次(因为这是在模块中,并且由于正则表达式没有regxg标志而分别创建):

y

您已经说过您不允许在环境中使用const ranges = [{ divider: 1e6, suffix: 'm' }, { divider: 1e3, suffix: 'k' }]; const regx = /^-?\d+(?:.\d{0,1})?/; export function getCurrencyValue(value: number) { for (const { divider, suffix } of ranges) { if (value >= divider) { const match = `${value / divider}`.match(regx); if (match) { return `${match[0]}${suffix}`; } } }); return String(value); // Presumably you always want it to be a string } ,因为您正在转换为ES5,并且不允许依赖regenerator-runtime。因此,您希望使用for-of而不是forEach

some

或使用const ranges = [{ divider: 1e6, suffix: 'm' }, { divider: 1e3, suffix: 'k' }]; const regx = /^-?\d+(?:.\d{0,1})?/; export function getCurrencyValue(value: number) { let formattedValue = String(value); // Presumably you want it to always be a string // Not allowed to use for-of, and the rule saying not to use it also doesn't like `for` loops, so... ranges.some(({ divider, suffix }) => { if (value >= divider) { const match = `${value / divider}`.match(regx); if (match) { formattedValue = `${match[0]}${suffix}`; return true; } } return false; }); return formattedValue; }

reduce