Files
Genarrative/apps/admin-web/src/pages/pageUtils.ts
T
k88936 6e419d0d80 清理(后台工具): 删除无调用方的 parseNonNegativeIntegerOrZero
- 该函数与 parsePositiveIntegerOrZero 行为一致且无任何调用点,删除死代码
2026-10-05 11:57:28 +08:00

61 lines
1.9 KiB
TypeScript

import { formatAdminApiError, isAdminApiError } from '../api/adminApiClient';
export function handlePageError(
error: unknown,
onUnauthorized: (message?: string) => void,
setError: (message: string) => void,
) {
if (isAdminApiError(error) && error.status === 401) {
onUnauthorized('登录状态已失效');
return;
}
setError(formatAdminApiError(error));
}
export function splitLines(value: string) {
return value
.split(/\r?\n|,/)
.map((item) => item.trim())
.filter(Boolean);
}
export function formatUnknownJson(value: unknown) {
if (value === null || typeof value === 'undefined') {
return '';
}
try {
return JSON.stringify(value, null, 2);
} catch {
return String(value);
}
}
/** 内部共用:只接受纯十进制数字串(允许前后空白),拒绝小数、科学计数法与非法 token。 */
function parseSafeIntegerText(value: string): number | null {
const trimmed = value.trim();
// 中文注释:只接受纯十进制数字串,避免 `Number` 把 `1.0` / `1e2` / `0x10` / `+5` 当成整数。
if (!/^\d+$/.test(trimmed)) {
return null;
}
const parsed = Number(trimmed);
return Number.isSafeInteger(parsed) ? parsed : null;
}
/** 严格解析正安全整数:空串、小数、科学计数法、非十进制、非正数与非数字都返回 `null`。 */
export function parsePositiveInteger(value: string): number | null {
const parsed = parseSafeIntegerText(value);
return parsed !== null && parsed > 0 ? parsed : null;
}
/** 严格解析非负安全整数:空串、小数、科学计数法、非十进制、负数与非数字都返回 `null`。 */
export function parseNonNegativeInteger(value: string): number | null {
return parseSafeIntegerText(value);
}
/** 落库用宽松解析:非法输入按 `0` 处理,避免后台保存被输入抖动打断。 */
export function parsePositiveIntegerOrZero(value: string): number {
return parsePositiveInteger(value) ?? 0;
}