Last active
June 11, 2020 15:03
-
-
Save mopcweb/e1338aed9760ef4e057163e1b832eabb to your computer and use it in GitHub Desktop.
Parses data and corrects types: from string to boolean | number
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* ------------------------------------------------------------------- */ | |
/** | |
* 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