#typescript #asynchronous #abstract-class
#typescript #асинхронный #абстрактный класс
Вопрос:
В моем проекте я использовал Typescript@4.0.3
, и он работал нормально, но теперь я обновил его версию до последней Typescript@4.1.3
, и она выдает мне много ошибок. Я не могу ничего найти в документации и не понимаю, как решить эту проблему.
вот мой код:
abstract class SystemValidator {
constructor() {}
abstract async validate(addr:Addr):Promise<[boolean, Addr[], SystemValidationErrors]>
}
Это выдает ошибку:
ошибка TS1243: модификатор ‘async’ нельзя использовать с модификатором ‘abstract’.
Есть идеи по решению этой проблемы?? Должен ли я удалить aync
отсюда??
Ответ №1:
Да, вы должны удалить async
.
Вы не должны принудительно использовать async
класс, который его реализует. Есть и другие способы вернуть a Promise
, а не только async
.
Редактировать:
Поскольку некоторым людям непонятно async
, почему это не важно. Вот несколько способов вернуть обещание:
async function iAmAsync(): Promise<boolean>{
return false;
}
function iAmNotAsync(): Promise<boolean>{
return new Promise(resolve => resolve(false));
}
function iAmAlsoNotAsync(): Promise<boolean>{
return new Observable().pipe(first()).toPromise();
}
iAmAsync().then();
iAmNotAsync().then();
Комментарии:
1. Он должен заставить класс, который его реализует, возвращать все, что ему нужно вернуть. Дело в том, что TypeScript ограничен в этом. Что должно произойти, так это то, что TypeScript должен разрешить асинхронный модификатор с abstract, если это то, что намеревается разработчик.
2. Вы это сказали. Интерфейс или абстрактный класс могут потребовать возврата всего, что вы хотите ,
async
модификатор не имеет к этому никакого отношения.3. Конечно, это так. Он преобразует любой возврат в обещание и информирует пользователя о функции, которая гарантированно возвращает обещание. Это JavaScript 101. Модификатор async имеет отношение только к возврату и не имеет ничего общего ни с чем другим. Если разработчик хочет применить его только для удобства чтения кода и не вынужден возвращать new Promise (), который на самом деле прозрачен и автоматизирован с помощью async, ему должно быть разрешено.
4. Смотрите Обновленный ответ с объяснением, почему он не должен быть принудительным 🙂
5. То, что вы можете отказаться от асинхронности, не означает, что это делает код более читаемым. Меньше не значит больше. Многие языки допускают применение избыточных модификаторов в интерфейсах специально для уменьшения вероятности ошибок и упрощения рефакторинга после изменений библиотеки (даже если это только визуальная справка). Например, Swift позволяет программисту применять именованные параметры для функций интерфейса, чтобы вызывающий должен был называть параметры при вызове. Я бы применил модификатор async только для удобства чтения кода (или просто для согласованности, чтобы гарантировать, что ctrl F через project может использовать простые ключевые слова).