TypeScript未正确解析undefined:联合类型判断后仍提示变量未定义
你在主函数upsert里已经通过if(shareholderCompany)判断字段存在后,才调用子函数upsertCompanyShareholderCompany,但子函数内依然提示该字段可能为undefined,核心原因是TypeScript的类型窄化无法跨函数自动传递:
- 在
upsert函数中,if(shareholderCompany)会把companyShareholder的类型从联合类型CompanyShareholdersDefinitionInterface窄化为CompanyShareholdersCompanyInterface(该类型中shareholderCompany是必填字段)。但这种类型信息不会跟着参数传递到子函数里。 - 子函数
upsertCompanyShareholderCompany的第二个参数类型依然是CompanyShareholdersDefinitionInterface(即CompanyShareholdersCompanyInterface | CompanyShareholdersExternalPersonInterface),而联合类型中的CompanyShareholdersExternalPersonInterface定义里,shareholderCompany是可选字段(带?标记),所以TypeScript会判定该字段可能为undefined。
修复方案
有两种常用的解决方式:
- 给子函数指定精确参数类型:将
upsertCompanyShareholderCompany的第二个参数类型改为CompanyShareholdersCompanyInterface,让TypeScript明确知道该参数必然包含shareholderCompany字段:export const upsertCompanyShareholderCompany = async(serviceData: any, companyShareholder: CompanyShareholdersCompanyInterface, { transaction }: any) => { const { company_id, source, class: shareholderClass, shareholderCompany } = companyShareholder; // 不再提示undefined } - 子函数内手动类型断言:如果不想修改参数类型,可以通过类型断言告诉TypeScript该字段必然存在:
// 方式1:非空断言 const { company_id, source, class: shareholderClass, shareholderCompany } = companyShareholder; const targetShareholder = shareholderCompany!; // 方式2:类型转换 const { company_id, source, class: shareholderClass, shareholderCompany } = companyShareholder as CompanyShareholdersCompanyInterface;
内容的提问来源于stack exchange,提问作者Joel Adams
相关产品推荐
相关产品推荐

