export function checkType(target: any) {
const value: string = Object.prototype.toString.call(target);
const result = (value.match(/\[object (\S*)\]/) as RegExpMatchArray)[1];
return result.toLocaleLowerCase() as JavaScriptTypes;
}
export function isType<T>(target: any, type: T extends "object" ? T : JavaScriptTypes): target is T extends JavaScriptTypes ? JavaScriptType[T] : T {
return checkType(target) === type;
}
export function modifyData<T extends object>(target: T, value: DeepPartial<T>) {
for (const key in value) {
if (Object.prototype.hasOwnProperty.call(target, key)) {
const item = value[key] as any;
const _target = target[key];
if (isType(_target, "object")) {
modifyData(_target, item);
} else {
target[key] = item;
}
}
}
}
export function setData<T extends object>(target: T, value: T) {
for (const key in value) {
target[key] = value[key];
}
}
export function formatDate(value: string | number | Date = Date.now(), format = "Y-M-D h:m:s") {
if (["null", null, "undefined", undefined, ""].includes(value as any)) return "";
if (typeof value === "string" && new Date(value).toString() === "Invalid Date") {
value = value.replace(/-/g, "/");
}
const formatNumber = (n: number) => `0${n}`.slice(-2);
const date = new Date(value);
const formatList = ["Y", "M", "D", "h", "m", "s"];
const resultList = [];
resultList.push(date.getFullYear().toString());
resultList.push(formatNumber(date.getMonth() + 1));
resultList.push(formatNumber(date.getDate()));
resultList.push(formatNumber(date.getHours()));
resultList.push(formatNumber(date.getMinutes()));
resultList.push(formatNumber(date.getSeconds()));
for (let i = 0; i < resultList.length; i++) {
format = format.replace(formatList[i], resultList[i]);
}
return format;
}
export function copyText(text: string, success?: () => void, fail?: (res: string) => void) {
text = text.replace(/(^\s*)|(\s*$)/g, "");
if (!text) {
fail && fail("复制的内容不能为空!");
return;
}
const id = "the-clipboard";
let clipboard = (document.getElementById(id) as HTMLTextAreaElement);
if (!clipboard) {
clipboard = document.createElement("textarea");
clipboard.id = id;
clipboard.readOnly = true;
clipboard.style.cssText = "font-size: 15px; position: fixed; top: -1000%; left: -1000%;";
document.body.appendChild(clipboard);
}
clipboard.value = text;
clipboard.select();
clipboard.setSelectionRange(0, clipboard.value.length);
const state = document.execCommand("copy");
if (state) {
success && success();
} else {
fail && fail("复制失败");
}
}
export function inputOnlyNumber(value: string | number, decimal?: boolean, negative?: boolean) {
let result = value.toString().trim();
if (result.length === 0) return "";
const minus = (negative && result[0] == "-") ? "-" : "";
if (decimal) {
result = result.replace(/[^0-9.]+/ig, "");
let array = result.split(".");
if (array.length > 1) {
result = array[0] + "." + array[1];
}
} else {
result = result.replace(/[^0-9]+/ig, "");
}
return minus + result;
}
export function deepClone<T>(target: T) {
const cache = new Map();
function clone(value: any): T {
if (!value || typeof value !== "object") return value;
if (cache.has(value)) {
return cache.get(value);
}
const result: any = Array.isArray(value) ? [] : {};
cache.set(value, result);
for (const key in value) {
result[key] = clone(value[key]);
}
return result;
}
return clone(target);
}
export function isExternal(path: string) {
return /^(https?:|mailto:|tel:)/.test(path);
}
export function jsonToPath(params: { [key: string]: number | string | boolean }) {
let result = "";
for (const key in params) {
result += `&${key}=${params[key]}`;
}
return result.slice(1);
}
export function jsonParse<T = any>(target: any, defaultValue: any = {}) {
let result: T = defaultValue;
if (isType(target, "string")) {
try {
result = JSON.parse(target);
} catch (error) {
console.warn("JSON格式化对象错误 >>", error);
}
}
return result;
}
export function isMobile() {
const pattern = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|OperaMini/i;
return pattern.test(navigator.userAgent);
}