所以我正在查看一些后端代码,我注意到任何地方的方法有async
在它前面,在try/catch
语句内TypeScript抱怨err
对象,说Object 'err' is unknown
,但这不会发生在同步的方法。
async createOrganization(dbSession: ClientSession, organization: IOrganization): Promise<IOrganization> {
try {
// @ts-ignore
const newOrganization = new this.Model(organization)
// @ts-ignore
await newOrganization.save()
// @ts-ignore
return newOrganization
} catch (err) {
throw new OrganizationCreationError(err.message)
}
}
在异步方法中使用try/catch
是什么使得err
对象是未知的,我该如何修复它?
catch子句变量历史上的类型为any
,但自从TypeScript 4.4在strict
编译器选项(或新的useUnknownInCatchVariables
选项)下,它现在类型为unknown
。这与方法的异步性无关。
如果你没有在代码库的其他部分看到这个错误,而这些部分属于相同的TypeScript版本和编译器选项,那么有几个可能的原因:
- catch子句变量没有以与
unknown
类型不兼容的方式使用,可能它被传递给接受unknown
或any
类型参数的函数。 - catch子句变量显式类型为
any
。