Надеюсь, это не слишком основано на мнении. Я думаю, что может быть лучшая практика, о которой я не знаю, или механизм, о котором я не знаю, или я, по крайней мере, хотел бы лучше понять плюсы и минусы возможных решений.
Скажем, у меня есть эти функции в службе Angular, которая называется ImportService, которая обрабатывает всю логику импорта:
/** Only call this after calling validateImportFile and getting back true! */
new(file: File): Observable<ImportResource> {
return this.apiService.importCreate(file);
}
validateImportFile(file: File): Boolean {
//some validation logic
}
Если бы TypeScript был больше похож на Java, я бы предпочел сделать что-то более похожее на:
new(file: File): Observable<ImportResource> throws ImportValidationError {
if(this.validateImportFile(file)) {
return this.apiService.importCreate(file);
} else {
throw new ImportValidationError("Your file is bad and you should feel bad");
}
}
private validateImportFile(file: File): Boolean {
//some validation logic
}
Чтобы вызывающие абоненты могли делать что-то более похожее на
try {
importService.new(aFile).subscribe( importInfo => {
//Display stuff about importInfo
}, error => {
//There was some kind of http error
});
} catch (ImportValidationError e) {
//There was something wrong with the file itself
}
Основными преимуществами являются
- new (), которые будут всегда проверяться, и вызывающие абоненты не должнызнать / не забывать вызывать validate вначале
- подпись new () четко сообщает вызывающим абонентам, что они должны обработать сбой проверки
- вызывающие new () могут легко отличить случай сбоя проверкии какой-то другой случай сбоя
, но из того, что я прочитал, выбрасывание ошибок таким образом является своего рода анти-паттерном в TypeScript прямо сейчас, потому что вы не можете поместить "throws"объявление в сигнатуре, чтобы предупредить вызывающих абонентов об этом, и компилятор не будет ожидать, что вызывающие абоненты его поймают, поэтому все эти преимущества потеряны.
Если вместо этого я возвращаю наблюдаемую ошибку, я не думаю, что вызывающие абоненты могут знать, что они ожидают ошибки определенного типа именно для ошибки проверки.
Другой вариант - вернуть объект-обертку, который указывает, была ли ошибка, и содержит наблюдаемую только в случае успеха, но это кажется загроможденным и достаточно окольным, поэтому мне нужно задаться вопросом, есть ли лучший способ. Есть ли?