Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 非空断言运算符仍引发编译时错误_Typescript_Typeorm - Fatal编程技术网

Typescript 非空断言运算符仍引发编译时错误

Typescript 非空断言运算符仍引发编译时错误,typescript,typeorm,Typescript,Typeorm,我正在使用运算符,告诉编译器忽略可能的未定义的值,但它似乎仍会引发错误 let rooms :Room[]; rooms = []; for (let id of roomIds) { let room: Room = await getRepository(Room).findOne({where: {id: id}})!; if(room) rooms.push(room);

我正在使用
运算符,告诉编译器忽略可能的
未定义的
值,但它似乎仍会引发错误

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.
src/resolvers/BookingResolver.ts:65:21-错误TS2322:Type“Room | undefined”不可分配给Type“Room”。
类型“未定义”不可分配给类型“房间”。
65 let room:room=等待getRepository(room).findOne({where:{id:id}})!;
~~~~
在CreateTError(/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts node/src/index.ts:513:12)
在报告错误(/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts node/src/index.ts:517:19)
在getOutput(/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts node/src/index.ts:752:36)
在Object.compile(/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts node/src/index.ts:968:32)
在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)
在Object.require.extensions。[as.ts](/home/tes/work/adey/source/AdeyBackEnd/server/node_modules/ts node/src/index.ts:1059:12)
在Module.load(内部/modules/cjs/loader.js:986:32)
at Function.Module._load(内部/modules/cjs/loader.js:879:14)
at Module.require(内部/modules/cjs/loader.js:1026:19)
[nodemon]应用程序崩溃-在启动前等待文件更改。

我假设
findOne
返回一个
承诺
,在这种情况下,您需要应用
运算符
的结果等待
,但现在您正在应用
等待之前执行code>

因此,请将代码更改为以下内容:

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 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.

你的
运算符正在应用于
承诺
。您需要移动
wait
表达式之外。如何定义
findOne
呢?感谢这两项工作:)