Как проверить типизированный объект с запасными значениями с помощью Typescript? - PullRequest
0 голосов
/ 07 апреля 2020

Как проверить тип деструктурированного объекта в следующей структуре?

interface IUser  {
    username: string
    image: string
    uid: string
}

interface IDataProp {
    user: IUser
}

const {
    user: {
        username,
        image,
        uid
    } = {},
} = { ...data, user: data.user || {} }

1 Ответ

1 голос
/ 07 апреля 2020

Ну, это странный сценарий, и его трудно охватить.
Я не совсем понимаю, почему вы бы деструктурировали объект data и выполнили бы клавишу user со значением data.user.
Ошибка компиляции (или вводящий в заблуждение тип) находится в значении по умолчанию. Поскольку присвоение не применяется к строго типизированному объекту, предоставляя значение по умолчанию, которое является пустым объектом {}, все переменные d должны иметь значение по умолчанию (даже явное undefined, в зависимости от tsconfig.json).

Полагаю, есть два подхода.

const {
    user: {
        username,
        image,
        uid
    }
} = { user: data.user || {} };

Нет значения по умолчанию user ключ. Теперь все переменные string напечатаны.
Второй подход, допустим значение по умолчанию user, но также предоставляем явные значения по умолчанию для переменных

const {
    user: {
        username = undefined,
        image = 'default-image',
        uid = '000-000-0'
    } = {}
} = { user: data.user || {} };

Это немного избыточно и, в этом случае , username имеет тип union string | undefined ... так что это довольно слабый тип.
В VSCode со средой Typescript, если вы наведите курсор мыши на клавишу user, компилятор теперь понимает, что это необязательный параметр. свойство user?: IUser типа IUser. Вот почему мы должны предоставить значения по умолчанию.

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

const {
    username,
    image,
    uid
}: IUser = { ...data.user || {} };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...