如何输入 returns 检索到的带有扩展的条带结帐会话的承诺?

how to type a promise that returns a retrieved stripe checkout session with expand?

有人知道如何输入 returns 检索到的带有扩展的条带结帐会话的承诺吗?

const session = await stripe.checkout.sessions.retrieve(event.data.object.id, {
      expand: ['line_items.data.price.product', 'customer'],
    })

到目前为止,这似乎还有很长的路要走

const session: Stripe.Checkout.Session = await stripe.checkout.sessions.retrieve(
      event.data.object.id,
      {
        expand: ['line_items.data.price.product', 'customer'],
      }
    )

const { name, email, created  } = session.customer as Stripe.Customer
const line_items = session.line_items.data

const {} = line_items[0]

line_items.data.price.product 未输入

不可能,但返回的会话对象包含客户和产品的 ID。您可以使用这些 ID 获取具有相应 API.

的客户和产品的详细信息

line_items.data.price.product不会被输入,因为Product有三种类型,第一种是stringhttps://github.com/stripe/stripe-node/blob/master/types/2020-08-27/Prices.d.ts#L64

你仍然可以做你想做的事,只是需要一些额外的步骤,因为你必须准确地告诉 TypeScript 它应该使用哪种类型:

const line_items: Stripe.LineItem[] = session.line_items?.data as Stripe.LineItem[];
const {price}: {price: Stripe.Price} = line_items[0] as Stripe.LineItem;  
const product: Stripe.Product = price.product as Stripe.Product;

// product will now be typed

我想我明白了:

const getSessionWithCustomerAndLineItems = async () => {
  const session = await stripe.checkout.sessions.retrieve("mockId", {
    expand: ["line_items.data.price.product", "customer"],
  });

  const customer = session.customer as Stripe.Customer;

  // Type is Stripe.LineItem[]
  const line_items = session.line_items.data;

  // Infers return type as:
  // Stripe.Response<Stripe.Checkout.Session> & {
  //   customer: Stripe.Customer,
  //   line_items: Stripe.LineItems[],
  // }
  return Object.assign(session, { customer, line_items });
};

要注意的关键是条带节点文档特别指出使用 'expand' 和 TypeScript 需要在结果中进行显式转换:https://github.com/stripe/stripe-node#using-expand-with-typescript

考虑到展开语句的产品部分,您可能还想在输出中直接包含一个 Products 数组:

const getSessionWithCustomerAndProducts = async () => {
  const session = await stripe.checkout.sessions.retrieve("mockId", {
    expand: ["line_items.data.price.product", "customer"],
  });

  const customer = session.customer as Stripe.Customer;

  // Type is Stripe.Product[]
  const products =
    session.line_items?.data.map(
      ({ price }) => price.product as Stripe.Product
    ) ?? [];

  // Infers return type as:
  // Stripe.Response<Stripe.Checkout.Session> & {
  //   customer: Stripe.Customer,
  //   products: Stripe.Product[],
  // }
  return Object.assign(session, { customer, products });
};