Оператор ненулевого утверждения все еще вызывает ошибку во время компиляции

#typescript #typeorm

#typescript #typeorm

Вопрос:

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

 let rooms :Room[];
            rooms = [];
            for (let id of roomIds) {
                let room: Room = await getRepository(Room).findOne({where: {id: id}})!;
                if(room) rooms.push(room);
            }
 

и ошибка

 src/resolvers/BookingResolver.ts:65:21 - error TS2322: Type 'Room | undefined' is not assignable to type 'Room'.
  Type 'undefined' is not assignable to type 'Room'.

65                 let room: Room = await getRepository(Room).findOne({where: {id: id}})!;
                       ~~~~

    at createTSError (/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts-node/src/index.ts:513:12)
    at reportTSError (/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts-node/src/index.ts:517:19)
    at getOutput (/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts-node/src/index.ts:752:36)
    at Object.compile (/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts-node/src/index.ts:968:32)
    at Module.m._compile (/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts-node/src/index.ts:1056:42)
    at Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Object.require.extensions.<computed> [as .ts] (/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts-node/src/index.ts:1059:12)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Module.require (internal/modules/cjs/loader.js:1026:19)
[nodemon] app crashed - waiting for file changes before starting.
 

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

1. Ваш ! оператор применяется к Promise<T> . Вам нужно переместить ! to за пределы await выражения.

2. Как это findOne определяется?

Ответ №1:

Я предполагаю findOne , что возвращает a Promise<Room | undefined> , и в этом случае вам нужно применить ! оператор к результату await , но прямо сейчас вы применяете ! перед await .

Поэтому измените свой код на что-то вроде этого:

 const rooms: Room[] = [];
for( let id of roomIds ) {
    const room: Room = ( await getRepository(Room).findOne( { where: { id: id } } ) )!;
    rooms.push( room );
}
 

… хотя лично я бы написал это так:

 const rooms: Room[] = [];
for( let id of roomIds ) {
    const room: Room | undefined = await getRepository(Room).findOne( { where: { id: id } } );
    rooms.push( room! );
}
 

… или, что еще лучше, используйте один объект репозитория и с параллельными запросами, чтобы программа работала намного быстрее в целом:

 const roomsRepo    = getRepository(Room);
const roomsResults = await Promise.all( roomIds.map( roomId => roomsRepo.findOne( { where: { id: roomId } } ) ) );
const rooms        = roomsResults.filter( r => r ); // Filter out `undefined` values.