Skip to content

Instantly share code, notes, and snippets.

@mopcweb
Last active June 11, 2020 15:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mopcweb/e1338aed9760ef4e057163e1b832eabb to your computer and use it in GitHub Desktop.
Save mopcweb/e1338aed9760ef4e057163e1b832eabb to your computer and use it in GitHub Desktop.
Parses data and corrects types: from string to boolean | number
/* ------------------------------------------------------------------- */
/**
* Parses data and corrects types: from string to boolean | number
*
* @param data - Data to parse
*/
/* ------------------------------------------------------------------- */
export const parseTypes = <T = any>(input: T, deepness?: number): T => {
function parser(data: T, deepLevel = 0): T {
let result: T;
if (deepness && !Number.isNaN(deepness) && deepLevel >= deepness) return data;
// Parse null
if (data === null || data === 'null') return null;
// Parse string
if (typeof data === 'string') {
const trimmed = data.trim();
if (trimmed.toLowerCase() === 'true') return true as T;
if (trimmed.toLowerCase() === 'false') return false as T;
if (trimmed === '') return data as T;
if (!Number.isNaN(+trimmed) && trimmed[0] !== '0') return +data as T;
return data as T;
}
// Parse array
if (Array.isArray(data) && data.length) {
return data.map((item) => parser(item, deepLevel + 1)) as T;
}
// Parse Date
if (data instanceof Date) return data;
// Parse object
if (typeof data === 'object' && !isEmpty(data as Record<string | number, any>)) {
(result as Record<string | number, any>) = { };
Object.keys(data).forEach((key) => {
(result as Record<string | number, any>)[key] = parser((data as Record<string | number, any>)[key], deepLevel + 1);
});
return result;
}
return data;
}
return parser(input);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment