TypeScript环境下PayPal SDK报错:paypal.Buttons()可能未定义如何解决?
解决SvelteKit+TypeScript集成PayPal SDK时的“Cannot invoke an object which is possibly undefined”错误
在SvelteKit的TypeScript项目中,按照PayPal官方示例调用paypal.Buttons()时,即使已经通过if(paypal)判断变量存在,TypeScript仍会抛出“Cannot invoke an object which is possibly undefined”的语法错误,以下是几种可行的解决方式:
方法1:使用非空断言运算符
在paypal后添加非空断言!,明确告知TypeScript此时paypal不可能为undefined:
if (paypal) { try { await paypal!.Buttons().render("#your-container-element"); } catch (error) { console.error("failed to render the PayPal Buttons", error); } }
此方法简单高效,前提是你确认if(paypal)的判断已完全排除undefined的情况。
方法2:显式指定变量类型
提前导入并指定paypal变量的准确类型,帮助TypeScript识别后续的类型守卫:
import { loadScript, PayPalNamespace } from "@paypal/paypal-js"; let paypal: PayPalNamespace | undefined; try { paypal = await loadScript({ clientId: "test" }); } catch (error) { console.error("failed to load the PayPal JS SDK script", error); } if (paypal) { try { await paypal.Buttons().render("#your-container-element"); } catch (error) { console.error("failed to render the PayPal Buttons", error); } }
通过显式声明类型,TypeScript能正确识别if(paypal)作为类型守卫的作用,自动消除错误提示。
方法3:使用类型断言
若上述方法无效,可通过类型断言强制指定paypal的类型:
if (paypal) { try { await (paypal as PayPalNamespace).Buttons().render("#your-container-element"); } catch (error) { console.error("failed to render the PayPal Buttons", error); } }
关于官方文档与类型定义的说明
当前PayPal官方README的示例未考虑TypeScript严格模式下的类型检查细节,确实可以建议官方更新示例,补充类型声明或非空断言,让TS项目直接适配。此外,SDK的类型定义可能存在小缺陷,导致TypeScript无法自动识别if(paypal)的类型守卫效果,但通过上述方法可完全规避该问题,无需等待官方修复。
内容的提问来源于stack exchange,提问作者Kevin Renskers
相关产品推荐
相关产品推荐

