next.js 无效类型“字符串|模板文字表达式的“undefined”,即使我安全地使用文字

ogq8wdun  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(126)

我有一个简单的组件,循环按钮。TS构建失败,我调用此循环时出错

17:60  Error: Invalid type "string | undefined" of template literal expression.

字符串
我在JSX返回中调用该函数,如下所示

{customerList && customerList as JSX.Element[]}


在我循环输出按钮的文件中没有模板文字,所以我不认为有问题。但这里是完整的文件(没有导入和导出)

const HiglightedCustomers = ({ customers, title }: { customers: Kunder[], title : string }) => {
  const CustomerTemplate = ({customer}:{customer: Kunder}) => {
    const {url, name} = customer
    return <div className="p-2">
        <Button href={url || "#"} externalLink={true} variant="bg-primary-light-pink">{name}</Button>
        </div>
  }
    const customerList = customers?.map((customer) => <CustomerTemplate key={customer.id} customer={customer} />);

    return (
    <div className="border bg-red-500 ">
      <h2 className="text-3xl  text-center">{title}</h2>
      <div className="flex max-w-3xl pt-3 flex-wrap justify-center">
      {customerList && customerList as JSX.Element[]}
      </div>
    </div>
  );
};


在我的-component中,我使用模板文字。但我这样做的方式对我来说似乎是安全的。我为我的props和函数设置了默认值,即使模板字面量是未定义的,它们也能正常工作
我的按钮文件

import { z } from 'zod';
import Link from 'next/link';
import { BgColorVariants } from '@/lib/commonTypes';

type Variant = z.infer<typeof BgColorVariants>;

const ButtonSchema = z.object({
  variant: BgColorVariants.optional(),
  children: z.string(),
  link: z.boolean().optional(), 
  externalLink: z.boolean().optional(),
  href: z.string().optional(),
});

type ButtonProps = z.infer<typeof ButtonSchema>;

const Button = ({ variant = 'bg-black', externalLink = false, href, children,...rest }: ButtonProps) => {
  const textColor = ({variant}:{variant: Variant}) => {
    // Returner svart tekst på bakgrunner som krever svart tekst, ellers svart tekst 
    if(variant === "bg-primary-light-pink"){
      return "text-black "
    }
    else {
      return "text-white group-hover:text-black"
    }
  }
  
  const ButtonContent = () => {
    const buttonStyle = `relative z-10 inline-flex items-center justify-center h-full w-full rounded py-2 px-3 ${textColor({ variant }) || ''} ${variant} border border-black group-hover:bg-primary-pink  group-hover:border-black group-hover:border-w`
    const shadowBox = "absolute top-[0.15em] left-[0.15em] h-full w-full group-hover:bg-black bg-transparent rounded py-2 px-3 z-0 group-hover:border-black group-hover:border "
    return (
      <div className="relative inline-block group">
        <div className={shadowBox}></div>
        <div className={buttonStyle}>{children}</div>
      </div>
    )
  };

  return (
    <>
      {href && !externalLink && <Link  href={href}><ButtonContent /></Link> }
      {href && externalLink && <a href={href} rel="external nofollow"><ButtonContent /></a> }
      {!href && <button ><ButtonContent /></button>}
      </>
  );
};


我快没办法了,这几天一直在调试这个程序。任何关于如何解决这个问题的建议都是非常受欢迎的。

zujrkrfu

zujrkrfu1#

customerList是一个组件,因此需要大写,例如Customerlist。

ulydmbyx

ulydmbyx2#

您的问题“无效类型”字符串|模板文字表达式的'undefined',”是由于TypeScript在类型检查期间处理可选属性的方式。具体来说,就是在渲染customerList的时候:

customerList as JSX.Element && customerList

字符串
问题出在创建customerList和使用可选的链接操作符(?)。尽管它可以生成表达式中带有undefined的联合类型,但可选的链接运算符可以安全地访问可能为undefined或null的属性。
在Map客户构建customerList之前,使用Array.isArray()判断customers是否为数组。
如果customers不是数组(未定义),则返回一个空数组以保证生成的customerList是JSX类型。Element[]。

相关问题