stripe.customers.retrieve 导致问题,因为它现在返回 Stripe.Customer | Stripe.DeletedCustomer

Mad*_*Mac 8 node.js stripe-payments typescript

我正在升级到最新的 Stripe API 版本 (2020-03-02),但我不确定如何访问客户对象上的值,因为它现在只显示 Stripe.Customer 和 Stripe.DeletedCustomer 之间属性的并集。

有关如何检查类型并转换为 Stripe.Customer 类型的任何提示?

我收到以下错误:

类型“客户 | ”上不存在属性“元数据” 已删除客户'。类型“DeletedCustomer”上不存在属性“元数据”。

 const customer: Stripe.Customer | Stripe.DeletedCustomer = await stripe.customers.retrieve(customerId);
 const uid = customer.metadata.firebaseUID;
Run Code Online (Sandbox Code Playgroud)

请注意,Customer 和 DeletedCustomer 是接口:

namespace Stripe {
     interface DeletedCustomer {
          id: string;
          object: 'customer';
          deleted: true;
        }
    
     interface Customer {
          id: string;
          metadata: Metadata;
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*Guo 5

我发现这个评论是为了区分Stripe.CustomerStripe.DeletedCustomer

所以这对我有用:

if (customer.deleted === true) {
  // TypeScript treats customer as Stripe.DeletedCustomer
} else {
  // TypeScript treats customer as Stripe.Customer
}
Run Code Online (Sandbox Code Playgroud)

我最初只是尝试过if (customer.deleted),但没有成功。TypeScript 仅在我添加=== true.


kxo*_*kxo 0

对于区分类型,您可以:

  1. 检查所需对象中是否存在非共享属性,
  2. (或/和)比较一个/该属性值

在您的情况下,Stripe.DeletedCustomer没有元数据属性,因此您可以简单地验证此属性是否存在,如果存在,则“客户”的类型为“Stripe.Customer”,否则为“Stripe.DeletedCustomer”类型:

const customer: Stripe.Customer | Stripe.DeletedCustomer = await stripe.customers.retrieve(customerId);

if(customer instanceof Object && "metadata" in customer) {
 // $customer is of type "Stripe.Customer"
 const uid = customer.metadata.firebaseUID;
}
else {
 // $customer is of type "Stripe.DeletedCustomer
}
Run Code Online (Sandbox Code Playgroud)

@参见: https: //www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and- Differentiating-types