Почему TypesScript пропускает ошибку на этапе присвоения результата парсинга json?
Пример кода:
type MyType = {
id:number,
page:number,
}
const j = `{"id": "1", "page": "2"}`
const a:MyType = JSON.parse(j)
console.log(typeof a.id, parseInt(a.id,10), a.id)
В результате парсинга json строки, все числа являются string, но при этом переменной a присвоен тип у которого id указан как number. Почему ts не ругается на этой строке, а выдает ошибку когда я хочу выполнить parseInt(a.id,10)
Ответы (2 шт):
Автор решения: Denis Merioara
→ Ссылка
В json строке цифры указаны как строка, уберите кавычки, тогда они станут числами
const j = `{"id": 1, "page": 2}`
Автор решения: ThisMan
→ Ссылка
Если хотите безопасное решение, то вам нужна собственная функция, которая бы проверяла JSON и выводила тип ( typescript из коробки так не умеет )
type MyType = {
id: number,
page: number,
}
const j1 = `{ "id": "1", "page": "2" }`;
const j2 = `{ "id": 1, "page": 2 }`;
// Эта функция говорит typescript, что в случае true переданный аргумент имеет тип MyType.
const isMyType = (json: any): json is MyType => {
const values = Object.values(json);
for(let i = 0; i < values.length; i++) {
if (typeof values[i] !== 'number') {
return false;
}
}
return true;
}
const a = JSON.parse(j1);
const b = JSON.parse(j2);
if (isMyType(a)) {
console.log(a); // не выведется.
}
if (isMyType(b)) {
console.log(b); // выведется и тип будет равен MyType.
}