如何修复 Typescript 错误“对象可能是‘未定义’”

Posted

技术标签:

【中文标题】如何修复 Typescript 错误“对象可能是‘未定义’”【英文标题】:How to fix Typescript error "Object is possibly 'undefined'" 【发布时间】:2019-08-20 22:09:31 【问题描述】:

我正在构建一个将使用 Stripe API 来处理付款的云函数。这是在一个firebase项目中。当我运行firebase deploy 时,我收到错误“对象可能'未定义'”const existingSource = customer.sources.data.filter( (s) => s.id === source).pop(); 我不确定如何解决这个问题。

这是我存在 getorCreateCustomer 的 xxx.ts

/** Read the stripe customer ID from firestore, or create a new one if missing */
export const getOrCreateCustomer = async(uid: string) => 
    const user = await getUser(uid); 
    const customerId = user && user.stripeCustomerId; 

    //if missing customerId, create it
    if (!customerId) 
        return createCustomer(uid); 
    
    else 
        return stripe.customers.retrieve(customerId); 
    

【问题讨论】:

请编辑问题以显示getOrCreateCustomer,因为这会返回可能未定义的对象。 @DougStevenson 抱歉,我编辑并添加了文件。希望你能帮忙。 【参考方案1】:

根据你的函数的定义和内容,TypeScript 无法推断 getOrCreateCustomer 的返回类型。它假设它可以返回未定义,并且它的严格模式要求您指出您可能正在引用未定义对象上的属性,这将导致运行时出错。

您需要做的是将返回类型声明为不可能未定义的内容,并确保函数主体中的代码在该保证上是正确的(否则您会得到一个新错误) .

如果您不能这样做(但您确实应该这样做),您可能希望在 tsconfig.json 文件中禁用严格模式,因为这是在您的代码中强制执行此级别正确性的原因。

我建议第一个选项,即使您必须编写更多代码行,因为它可以更好地使用 TypeScript 的打字系统。

【讨论】:

【参考方案2】:

@Doug 提到的内容,但您也可以编写逻辑以确保 customer.sources.data 的每个部分都不是未定义的...

即:

const  sources  = customer

if (sources) 
  const  data  = sources 
  if (data) 
     // then filter / etc etc ...
  

【讨论】:

【参考方案3】:

7 个月后,我找到了最佳解决方案。

我只是将 firebase 可调用函数的内容包装在下面的 if/else 语句中。这有点多余,但它有效。

if (!context.auth) 
    // Throwing an HttpsError so that the client gets the error details.
    throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
        'while authenticated.');
  
  else ...copy function code here 

如果您不关心身份验证部分,您可以简单地将上下文类型定义为 any

(data, context:any)

【讨论】:

以上是关于如何修复 Typescript 错误“对象可能是‘未定义’”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 npm 无法全局安装 typescript 错误

使用 Vuex mapGetters 时如何修复 TypeScript 错误?

如何修复这个 typescript 和 graphql 错误?

从java转换后如何修复typescript类文件错误?

如何修复已使用 react 和 typescript 声明的错误标识符?

如何修复 Typescript 编译错误 ts2345“类型 'Response' 丢失......来自'Response'类型:重定向、预告片、formData!”