Уточнение типа "забыв" значение в выражении? - PullRequest
1 голос
/ 21 апреля 2020

Переходя от потока Я часто уточняю mixed типов в какой-то лучший формат. В машинописи я использую unknown вместо смешанного. В результате получается следующий код для обработки ошибок:

type err = {
    cause: unknown,
    msg: string,
}

if (typeof err.cause === 'object' && 
    err.cause !== null && 
    'incomplete' in err.cause && 
    Array.isArray(err.cause.incomplete)) {
    something(err.cause.incomplete[0]);
    //..something
}

Насколько я могу сказать, это должно работать? - Сначала я проверяю, является ли cause допустимым объектом, а затем проверяю, находится ли внутри него incomplete.

Однако в Array.isArray:

Error:(26, 37) TS2339: Property 'incomplete' does not exist on type 'object'.
* появляется ошибка 1013 * Так что заставляет машинопись «забыть» предыдущее уточнение и как заставить его работать?

1 Ответ

0 голосов
/ 21 апреля 2020

Это уточняет unknown до object, но вы не можете получить доступ к произвольным полям объекта, а 'incomplete' in err.cause на самом деле не уточняет тип. Для этого вам понадобится охрана типа . Пример:

function f(o: object) {
    if ("incomplete" in o) {
        console.log(o.incomplete); // error
    }
    if (hasIncomplete(o)) {
        console.log(o.incomplete); // okay
    }
}

function hasIncomplete(o: object): o is HasIncomplete {
    return o.hasOwnProperty("incomplete");
}

interface HasIncomplete {
    incomplete: any;
}
...