Как очистить этот объект, возможно, ошибка null?

#reactjs #typescript

#reactjs #typescript

Вопрос:

Сейчас я тестирую firebase.auth().currentUser ожидаемое, иногда оно может быть нулевым.

 export type AppState = {
  readonly labs: {
    [labId: string]: LabState;
  };
  readonly labUi: LabUiState;
  readonly editor: EditorState;
  readonly firebase?: FirebaseReducer.Reducer<{}>;
};

 export const loadState = (): AppState => {
  if (firebase.auth().currentUser.uid) {
    let userId = firebase.auth().currentUser.uid;
    return firebase.database().ref('/users/'   userId).once('value').then(function(snapshot) {
        return snapshot.val() as AppState;
      });
  }
};
 

Как вы можете видеть, я проверяю, есть ли пользователь. если пользователь, я что-то делаю.
но машинопись выдает мне предупреждение об этих проблемах. Что-то не так с тем, что я делаю прямо сейчас?

введите описание изображения здесь

Ответ №1:

Как вы можете видеть, я проверяю, есть ли пользователь…

Вы проверяете, является ли .uid свойство currentUser ложным, но ошибка сообщает вам, что значение (предположительно currentUser ) может быть null .

Итак, нужно сделать две вещи:

  1. Проверить currentUser , а не свойство на нем (или, возможно, и то, и другое); и
  2. Вводится currentUser в константу перед ее проверкой, чтобы TypeScript знал, что можно сузить тип этого значения.

В соответствии с этими строками:

 export const loadState = (): AppState => {
    const { currentUser } = firebase.auth();
    if (currentUser) {
        let userId = currentUser.uid;
        return firebase.database().ref('/users/'   userId).once('value').then(function(snapshot) {
            return snapshot.val() as AppState;
        });
    }
};
 

Или, поскольку у вас уже есть userId переменная, возможно, с необязательной цепочкой ( ?. ):

 export const loadState = (): AppState => {
    const userId = firebase.auth().currentUser?.uid;
    if (userId) {
        return firebase.database().ref('/users/'   userId).once('value').then(function(snapshot) {
            return snapshot.val() as AppState;
        });
    }
};
 

Комментарии:

1. Большое спасибо, если вы не возражаете. Знаете ли вы, почему эта ошибка также возникает? Type 'Promise<AppState>' is missing the following properties from type 'AppState': labs, labUi, editor

2.@Kerry — Ваша функция возвращает обещание, а не an AppState . На самом деле он возвращает обещание или undefined , которое я бы предложил изменить. Но в его текущем виде его возвращаемый тип должен быть Promise<AppState> | undefined , а не просто AppState .