Тип Guard для пустого объекта - PullRequest
0 голосов
/ 04 сентября 2018

Можно ли написать защиту типа TypeScript, которая проверяет, является ли данный объект пустым?

Я могу сделать противоположное, то есть написать защиту типа, которая проверяет, является ли объект непустым (здесь используется lodash isEmpty ):

isNonEmpty<T>(object: T | {}): object is T {
    return !_.isEmpty(object);
}

writeTextIfAny(param: { text: string } | {}): void {
    if (isNonEmpty(param)) {
        console.log(param.text);
    }
}

Однако, когда я пытаюсь все изменить, что-то идет не так:

isEmpty<T>(object: T | {}): object is {} {
    return _.isEmpty(object);
}

writeTextIfAny(param: { text: string } | {}): void {
    if (!this.isEmpty(param)) {
        // param is never, not { text: string }
    }
}

Почему это?

1 Ответ

0 голосов
/ 04 сентября 2018

Как правило, тип объекта TypeScript включает любой объект, имеющий не менее указанных свойств. Это означает, что {} фактически является типом любого объекта. Так что, если ваш пользовательский охранник утверждает, что param не является {}, то это также не {text: string}, и у вас остается never. (На самом деле, T | {} просто упрощается до {}, хотя может быть не совсем .)

Я не верю, что есть способ написать тип защиты для пустого объекта. Если вы расскажете подробнее о том, как это произошло, у меня может быть больше предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...