Ошибка ESLint, тип ‘() => Promise’ отсутствуют следующие свойства из типа ‘Promise’: затем catch, [Symbol.toStringTag], наконец

#javascript #typescript #eslint #typescript-eslint

#javascript #typescript #eslint #typescript-eslint

Вопрос:

Я получаю ошибку, которую я могу исправить, только добавив any в качестве возвращаемого значения.

 export const dbConnections: any = {};

export const connectDb: Promise<void> = async () => {
    if (dbConnections.isConnected) {
        return;
    }

    try {
        const db = await mongoose.connect(config.get('mongoURI'), {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useFindAndModify: false,
            useCreateIndex: true,
        });

        dbConnections.isConnected = db.connections[0].readyState;
    } catch (err) {
        createError('Error caught connecting to db!', err);
    }
};
  

Это выдает ошибку,

 export const connectDb: Promise<void> = async () => {
                                        ^^^^^^^^^^^^^
Type '() => Promise<void>' is missing the following properties
  from type 'Promise<void>': then, catch, [Symbol.toStringTag], finally
  

Если я сделаю any вместо Promise<void> , ошибка исчезнет, но это, очевидно, не то, как я пытаюсь это сделать. Как я могу исправить эту ошибку lint?

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

1. Потому что вы назначаете функцию connectDb , а не обещание. Либо вам нужно, чтобы тип был () => Promise<void> , либо измените его, чтобы значением была выполняемая функция (возможно, с помощью IIFE).

2. Кроме того, это не ошибка lint — это ошибка компилятора . TS выполняет свою работу правильно, предупреждая вас о том, что то, что вы хотите иметь как connectDb и то, что у вас на самом деле есть для connectDb , не совпадает.

3. Установка значения export const connectDb = async (): Promise<void> => { сработало, спасибо. Я просто хочу отметить, что это существующий проект с TS, и только час назад я решил добавить к нему ESLint, следуя этому руководству, и именно тогда я начал получать эту ошибку. Еще раз спасибо

4. Я получаю эту ошибку, когда пробую код в ссылке Playground

Ответ №1:

Проблема в объявлении функции. Вам нужно указать возвращаемый тип как Promise<void> .

 export const connectDb = async (): Promise<void> => {
    if (dbConnections.isConnected) {
        return;
    }

    try {
        const db = await mongoose.connect(config.get('mongoURI'), {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useFindAndModify: false,
            useCreateIndex: true,
        });

        dbConnections.isConnected = db.connections[0].readyState;
    } catch (err) {
        createError('Error caught connecting to db!', err);
    }
};
  

Ответ №2:

Асинхронные функции в typescript возвращают значение обещания.

вот так:

 export const dbConnections: any = {};

export const connectDb: () => Promise<void> = async () => {
    ...
};