【问题标题】:The program works but I'm getting an error Object is of type 'unknown'.ts(2571) at the bottom cart[1]该程序有效,但我收到一个错误 Object is of type 'unknown'.ts(2571) at the bottom cart[1]
【发布时间】:2022-01-09 12:44:07
【问题描述】:

错误发生在 if cart[1] 购物车[1] 带有下划线,我无法将代码部署到 Vercel。

以为是条带问题,但我彻底检查了条带 API,这段代码尽我所能理解。

这是完整的文件。它是一个 .ts 扩展名

import { NextApiRequest, NextApiResponse } from "next";

import Stripe from "stripe";
const stripe = new     Stripe(process.env.STRIPE_SECRET_KEY!, {
  apiVersion: "2020-03-02",
});

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method === "POST") {
    try {
      const cartItems = req.body;
      const line_items = validateCartItems(cartItems);
      const subscriptionInCart = isSubscriptionInCart(cartItems);
      const params: Stripe.Checkout.SessionCreateParams = {
        mode: subscriptionInCart ? "subscription" : "payment",
        payment_method_types: ["card"],
        billing_address_collection: "auto",
        shipping_address_collection: {
          allowed_countries: ["US", "CA"],
        },
        line_items,
        success_url: `${req.headers.origin}/result?session_id=.   {CHECKOUT_SESSION_ID}`,
        cancel_url: `${req.headers.origin}/use-shopping-cart`,
      };
      const checkoutSession: Stripe.Checkout.Session =
        await stripe.checkout.sessions.create(params);

      res.status(200).json(checkoutSession);
    } catch (err: any) {
      res.status(500).json({ statusCode: 500, message: err.message });
    }
  } else {
    res.setHeader("Allow", "POST");
    res.status(405).end("Method Not Allowed");
  }
}

const validateCartItems = (cartDetails: any) => {
  const validatedItems = [];
  for (const sku in cartDetails) {
    const product = cartDetails[sku];
    const item = {
      price: product.sku,
      quantity: product.quantity,
    };
    validatedItems.push(item);
  }

  return validatedItems;
};

const isSubscriptionInCart = (cartDetails: any) => {
  let subscriptionFound = false;
  for (const cartItem of Object.entries(cartDetails)) {
    if (cartItem[1].recurring) {
      subscriptionFound = true;
    }
  }
  return subscriptionFound;
};

【问题讨论】:

  • 如果出现错误,程序如何工作?
  • 它本身工作,它在本地工作并执行所有功能。它是一个电子商务,我可以创建订阅并将其记录在我的条纹仪表板上——这就是我所说的作品。
  • 图编译器抱怨值类型将代码更改为: const isSubscriptionInCart = (cartDetails: any) => { let subscriptionFound = false; let recurring = cartDetails try { for (const cartItem of Object.entries(cartDetails)) { if (cartItem[1]= recurring) { subscriptionFound = true; } } } 捕捉(错误){ console.log(错误); } 返回订阅发现; };
  • 您应该在validateCartItemsisSubscriptionInCart 函数中正确键入cartDetails,以避免出现类似这样的潜在问题。
  • 因为cartDetails 的类型为any,所以运行(const cartItem of Object.entries(cartDetails)) 意味着cartItem 的类型为[string, unknown],这会导致问题,因为TypeScript 期望cartItem[1] 是@987654331 @ 并且不包含属性 recurring。正确输入 cartDetails 可以解决这个问题 - cartDetails 的格式是什么?

标签: reactjs typescript next.js


【解决方案1】:

正如@juliomalves 所述,您的cartDetails 正确识别类型错误。

您需要为cartDetails 指定一个类型,以便cartItem[1].recurring 的定义方式与您对它的使用相匹配。

类似const isSubscriptionInCart = (cartDetails: Array<{recurring: boolean}>) => { ...} 或更好的是定义您自己的type CartItem 并使用Array<CartItem>

【讨论】:

  • 谢谢!这个答案很完美,定义类型绝对是更简洁的代码。
猜你喜欢
  • 2022-12-19
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2022-12-13
  • 2023-01-30
  • 2022-12-27
相关资源
最近更新 更多