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 是否可以在函数调用外部使用不可为null的方式缩小联合类型?_Typescript_Composition_Union Types - Fatal编程技术网

Typescript 是否可以在函数调用外部使用不可为null的方式缩小联合类型?

Typescript 是否可以在函数调用外部使用不可为null的方式缩小联合类型?,typescript,composition,union-types,Typescript,Composition,Union Types,我有一个用例类,从存储库中获取Invoice对象。它的类型是Invoice | null的并集,然后我将此对象传递给验证函数,该函数不返回任何内容-如果有错误,它只会抛出。如何描述函数的类型,以便在调用wait verifyentityvisibilityincirentcontext(…)后,invoice变量仅限于invoice类型?我尝试了本文中提到的不可为null的方法,但对我来说很难实现它 守则: 导出类GetRelatedDocumentsCase{ 私有异步getInvoiceRe

我有一个用例类,从存储库中获取Invoice对象。它的类型是
Invoice | null
的并集,然后我将此对象传递给验证函数,该函数不返回任何内容-如果有错误,它只会抛出。如何描述函数的类型,以便在调用
wait verifyentityvisibilityincirentcontext(…)
后,
invoice
变量仅限于invoice类型?我尝试了本文中提到的不可为null的方法,但对我来说很难实现它

守则:
导出类GetRelatedDocumentsCase{
私有异步getInvoiceRelatedDocuments(invoiceId:string,ctx:Context){
const invoice:invoice | null=等待此.invoicesRepository.findOneInvoiceById(invoiceId);
等待VerifyEntityVisibilityIncirentContext(发票、ctx、permissionDeniedMessage、this.CompanyRepository);
//我希望此处的发票变量仅为发票类型
等待发票对象(发票)中的某些内容
}
}
//Helper函数——我试图用'never'来描述它的返回类型,或者应用文章中的一些代码
导出异步函数verifyEntityVisibilityInCurrentContext(
实体,ctx:上下文,permissionDeniedMessage,CompanyRepository):承诺{
if(isNil(实体)){
抛出新的PermissionDenied(permissionDeniedMessage);
}
如果(!isObjectVisibleInContext(实体,ctx)){
const company=await companysrepository.findCompanyById(entity.companyId);
const companyUser=company.users.find(companyUser=>companyUser.userId==ctx.userId);
if(isNil(公司用户)){
抛出新的PermissionDenied(permissionDeniedMessage);
}
抛出新的不成立公司({
desiredCompanyId:entity.companyId,
});
}
}

您可以创建类型验证功能

isInvoice = (arg: Invoice|null): arg is Invoice => {
        return arg !== null ? true : false;
    }

您已经在助手中抛出错误。当
invoice
null
时,您要做的是抛出一个附加错误。Typescript将自动将类型从
if(!Invoice)
分支下的
Invoice
细化为
Invoice

private async getInvoiceRelatedDocuments(invoiceId: string, ctx: Context): Promise<Invoice> {
    const invoice: Invoice|null = await this.invoicesRepository.findOneInvoiceById(invoiceId);

    await verifyEntityVisibilityInCurrentContext(invoice, ctx, permissionDeniedMessage, this.companiesRepository);

    if ( ! invoice ) {
        throw new Error("null invoice");
    }
    // now variable is only type Invoice
    await doSomethingWithInvoiceObject(invoice);
    return invoice;
}
私有异步getInvoiceRelatedDocuments(invoiceId:string,ctx:Context):承诺{ const invoice:invoice | null=等待此.invoicesRepository.findOneInvoiceById(invoiceId); 等待VerifyEntityVisibilityIncirentContext(发票、ctx、permissionDeniedMessage、this.CompanyRepository); 如果(!发票){ 抛出新错误(“空发票”); } //现在变量是唯一的发票类型 等待发票上的物品(发票); 退货发票; }
我知道这种方法,但我不想使用任何
如果您尝试了
流命令,请等待发票对象(发票!)中的某个内容?谢谢,我忘了这个功能。但对我来说,它看起来很麻烦,不是吗?请考虑把这个代码编译成一个唯一的问题,就是你所拥有的代码。目前,存在大量未定义的类型和值,这阻止了有人将其放入IDE并回答您的问题。我建议让您的
verifyEntityVisibility…()
函数返回非空的invoice对象,并让调用函数使用它。您可能需要将该函数设置为泛型,以便返回的对象是type
Invoice
,而不是
any
或其他任何类型。如果你能把这个做成一个。祝你好运
private async getInvoiceRelatedDocuments(invoiceId: string, ctx: Context): Promise<Invoice> {
    const invoice: Invoice|null = await this.invoicesRepository.findOneInvoiceById(invoiceId);

    await verifyEntityVisibilityInCurrentContext(invoice, ctx, permissionDeniedMessage, this.companiesRepository);

    if ( ! invoice ) {
        throw new Error("null invoice");
    }
    // now variable is only type Invoice
    await doSomethingWithInvoiceObject(invoice);
    return invoice;
}