Почему 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.
}

→ Ссылка