TypeScript实现String转Number扩展,解析失败返回null如何处理?
实现方案
你可以通过判断parseFloat的解析结果是否为有效有限数值来实现需求,同时可按需增加边界场景兼容逻辑,具体如下:
基础实现(仅针对合法String实例调用场景)
declare global { interface String { toNumber(): number | null; } } String.prototype.toNumber = function(this: string) { const parsedNum = parseFloat(this); // 仅当解析结果为有效有限数字时返回,否则返回null return Number.isFinite(parsedNum) ? parsedNum : null; }
兼容null/undefined极端场景实现
如果需要覆盖通过call/apply等方式将this指向null/undefined的调用场景,可以调整为如下实现:
declare global { interface String { toNumber(this: string | null | undefined): number | null; } } String.prototype.toNumber = function(this: string | null | undefined) { // 先处理null/undefined场景 if (this == null) return null; const parsedNum = parseFloat(String(this)); return Number.isFinite(parsedNum) ? parsedNum : null; }
严格格式校验实现
如果需要排除'123abc'这类开头为数字、后续带非数字字符的解析场景(parseFloat默认会解析为123),可以增加正则全量校验:
declare global { interface String { toNumber(): number | null; } } String.prototype.toNumber = function(this: string) { // 校验整串是否为合法数字格式(支持前后空格、正负号、小数、科学计数法) const numRegex = /^\s*[-+]?(\d+\.?\d*|\.\d+)([eE][-+]?\d+)?\s*$/; if (!numRegex.test(this)) return null; const parsedNum = parseFloat(this); return Number.isFinite(parsedNum) ? parsedNum : null; }
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

