如何输入 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
有三种类型,第一种是string
:https://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 });
};
有人知道如何输入 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
有三种类型,第一种是string
:https://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 });
};