下面我有一个函数,该函数接受数字值并将其解析为货币值,例如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;
}
答案 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
都移到函数外,这样就不会每次都重新创建一次(因为这是在模块中,并且由于正则表达式没有regx
或g
标志而分别创建):
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