#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
.
Итак, нужно сделать две вещи:
- Проверить
currentUser
, а не свойство на нем (или, возможно, и то, и другое); и - Вводится
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
.