ошибка TS1243: модификатор ‘async’ нельзя использовать с модификатором ‘abstract’

#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 может использовать простые ключевые слова).