From f6842832bc7c5ca1d59e608858fed27b0f3c8b0d Mon Sep 17 00:00:00 2001 From: betavs Date: Thu, 25 Dec 2025 17:03:10 +0800 Subject: [PATCH] refactor: number validation functions for enhanced accuracy --- packages/components/common/utils.ts | 4 ++-- packages/components/common/validator.ts | 12 ++++++++++-- packages/components/guide/guide.ts | 6 +++--- packages/components/skeleton/skeleton.ts | 7 ++++--- packages/components/tag/tag.ts | 4 ++-- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/components/common/utils.ts b/packages/components/common/utils.ts index 545d40665..f102f5233 100644 --- a/packages/components/common/utils.ts +++ b/packages/components/common/utils.ts @@ -1,5 +1,5 @@ import { prefix } from './config'; -import { isString, isNumber, isDef, isBoolean, isObject } from './validator'; +import { isString, isNumeric, isDef, isBoolean, isObject } from './validator'; import { getWindowInfo, getAppBaseInfo, getDeviceInfo } from './wechat'; interface WxWorkSystemInfo extends WechatMiniprogram.SystemInfo { @@ -152,7 +152,7 @@ export const addUnit = function (value?: string | number): string | undefined { return undefined; } value = String(value); - return isNumber(value) ? `${value}px` : value; + return isNumeric(value) ? `${value}px` : value; }; /** diff --git a/packages/components/common/validator.ts b/packages/components/common/validator.ts index 67209a5d9..4c5dab036 100644 --- a/packages/components/common/validator.ts +++ b/packages/components/common/validator.ts @@ -16,8 +16,16 @@ export function isDef(value: unknown): boolean { return !isUndefined(value) && !isNull(value); } -export function isNumber(value: string | number): boolean { - return typeof value === 'number' || /^-?\d+(\.\d+)?$/.test(value); +export function isInteger(value: unknown): boolean { + return Number.isInteger(value); +} + +export function isNumeric(value: unknown): boolean { + return !Number.isNaN(Number(value)); +} + +export function isNumber(value: unknown): boolean { + return typeof value === 'number'; } export function isBoolean(value: unknown): value is boolean { diff --git a/packages/components/guide/guide.ts b/packages/components/guide/guide.ts index 991da05f4..a9c26c1b4 100644 --- a/packages/components/guide/guide.ts +++ b/packages/components/guide/guide.ts @@ -1,7 +1,7 @@ import { SuperComponent, wxComponent } from '../common/src/index'; import props from './props'; import config from '../common/config'; -import { isFunction, isNumber } from '../common/validator'; +import { isFunction, isNumeric } from '../common/validator'; import { TdGuideProps, GuideStep } from './type'; import { debounce, getRect, rpx2px, styles, unitConvert, nextTick, systemInfo } from '../common/utils'; @@ -214,8 +214,8 @@ export default class Guide extends SuperComponent { }, getPlacement() { const space = rpx2px(32); - const offsetLeft = (offset) => unitConvert(isNumber(offset?.[0]) ? `${offset?.[0]}rpx` : offset?.[0] || 0); - const offsetTop = (offset) => unitConvert(isNumber(offset?.[1]) ? `${offset?.[1]}rpx` : offset?.[1] || 0); + const offsetLeft = (offset) => unitConvert(isNumeric(offset?.[0]) ? `${offset?.[0]}rpx` : offset?.[0] || 0); + const offsetTop = (offset) => unitConvert(isNumeric(offset?.[1]) ? `${offset?.[1]}rpx` : offset?.[1] || 0); const left = (place) => parseFloat(place.left); const right = (place) => parseFloat(place.right); const top = (place) => parseFloat(place.top); diff --git a/packages/components/skeleton/skeleton.ts b/packages/components/skeleton/skeleton.ts index 78b3737f5..fe8d87b08 100644 --- a/packages/components/skeleton/skeleton.ts +++ b/packages/components/skeleton/skeleton.ts @@ -4,7 +4,7 @@ import props from './props'; import { SkeletonRowColObj } from './type'; import { ClassName, Styles } from '../common/common'; import { classNames } from '../common/utils'; -import { isNumber } from '../common/validator'; +import { isInteger, isNumeric } from '../common/validator'; const { prefix } = config; const name = `${prefix}-skeleton`; @@ -68,12 +68,13 @@ export default class Skeleton extends SuperComponent { } const parsedRowCols = rowCols.map((item) => { - if (isNumber(item)) { + if (isInteger(item) && item >= 0) { return new Array(item).fill({ class: this.getColItemClass({ type: 'text' }), style: {}, }); } + if (Array.isArray(item)) { return item.map((col) => { return { @@ -122,7 +123,7 @@ export default class Skeleton extends SuperComponent { const style: Styles = {}; styleName.forEach((name) => { if (name in obj) { - const px = isNumber(obj[name]) ? `${obj[name]}px` : obj[name]; + const px = isNumeric(obj[name]) ? `${obj[name]}px` : obj[name]; if (name === 'size') { [style.width, style.height] = [px, px]; } else { diff --git a/packages/components/tag/tag.ts b/packages/components/tag/tag.ts index 9cccc1578..ef98b8a25 100644 --- a/packages/components/tag/tag.ts +++ b/packages/components/tag/tag.ts @@ -2,7 +2,7 @@ import { wxComponent, SuperComponent } from '../common/src/index'; import config from '../common/config'; import props from './props'; import { classNames, calcIcon } from '../common/utils'; -import { isNumber } from '../common/validator'; +import { isNumeric } from '../common/validator'; const { prefix } = config; const name = `${prefix}-tag`; @@ -77,7 +77,7 @@ export default class Tag extends SuperComponent { if (!maxWidth) { return ''; } - const width = isNumber(maxWidth) ? `${maxWidth}px` : maxWidth; + const width = isNumeric(maxWidth) ? `${maxWidth}px` : maxWidth; this.setData({ tagStyle: `max-width:${width};` }); },