【问题标题】:React component prop throwing error typescript反应组件道具抛出错误打字稿
【发布时间】:2021-12-02 06:33:31
【问题描述】:

我正在尝试使用我已经定义了这样的 prop 类型的组件

export type Props = {
  variant: "green" | "red" | "grey" | "yellow";
};

组件是这样的

const Tag: FC<Props> = (props) => {
  const { variant, ...rest } = props;

  return (
    <div
      {...rest}
      sx={{
        bg: variant,
      }}
    />
  );
};

现在当我尝试像这样使用这个组件时

const statusColour: { [key: string]: string } = {
  running: "green",
  stopped: "red",
  idle: "grey",
  default: "green"
};

const variant = statusColour[value]
          ? statusColour[value]
          : statusColour["default"];

<Tag variant={variant} />

variant 属性出现此错误

类型“字符串”不可分配给类型“绿色”| “红” | “灰色” | "黄色"'.ts(2322)

types.d.ts(2, 5):预期类型来自属性“variant”,该属性在此处声明为 type 'IntrinsicAttributes & TagProps & { children?: ReactNode; }'

(JSX 属性)变体:“绿色”| “红” | “灰色” | “黄色”

谁能帮我解决一下,谢谢

【问题讨论】:

  • 第二个代码中的Props 是什么?是从第一个代码开始的吗?
  • 在第二个中,它是一个对象数组和一些其他数据。基本上,当我遍历数组时,我会得到稍后用于渲染 Tag 组件的状态
  • 就类型而言,因为我猜react 也提供了Props 类型并且你也创建了它。那么,这是您的Props 类型还是react's
  • 抱歉,您说的是哪些道具?标记一个或另一个组件。
  • FC&lt;Props&gt;

标签: reactjs typescript react-props


【解决方案1】:

类型“字符串”不可分配给类型“绿色”| “红” | “灰色” | "黄色"'.ts(2322)

此错误意味着string 类型的任何字符串都不能分配给特定 字符串"green" | "red" | "grey" | "yellow" 的联合。这是有道理的。 "banana"string,但它不应分配给 "apple" | "pear"

要修复它,您需要告诉statusColor 的类型,它可能只有那些特定字符串之一的值。

因此,只需使映射类型的值与 Props 中的 variant 相同即可。

const statusColour: { [key: string]: Props['variant'] } = {
  running: "green",
  stopped: "red",
  idle: "grey",
  default: "green"
};

Playground


或者通过将变体联合设为自己的类型别名来清理它:

type MyVariant = "green" | "red" | "grey" | "yellow"

export type Props = {
  variant: MyVariant;
};

const statusColour: { [key: string]: MyVariant } = {
  running: "green",
  stopped: "red",
  idle: "grey",
  default: "green"
};

Playground

【讨论】:

    【解决方案2】:

    所以想通了我的错误。基本上,variant 道具需要"green" | "red" | "grey" | "yellow"; 类型的东西,但我传递的是一个字符串。为了解决它,这就是我所做的:

    const statusColour: { [key: string]: string } = {
      running: "green",
      stopped: "red",
      idle: "grey",
      default: "green"
    };
    
    const variant = statusColour[value] as "green" | "red" | "grey" | "yellow"
              
    
    <Tag variant={variant} />
    

    我知道这不是最好的解决方案。因此,如果有人可以发布更好的解决方案,那将非常有帮助。谢谢

    【讨论】:

    • 这不是一个好的解决方案。这会将string 不安全地转换为更具体的类型。使用as 告诉编译器你比它更了解。你最好使用 stricter 类型,这样你就不必转换值了。
    • @AlexWayne 我明白你的意思。但在这里我需要这样做,因为statusColour 也在其他一些地方使用。如果我强加一个更严格的类型,其他部分就会坏掉。我可以获得更严格类型的唯一方法是为变体创建一个单独的对象。当我知道这里会发生什么时,对我来说似乎有点过度工程。但是,如果您有其他建议,我会全力以赴。 :)
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2020-11-23
    • 2018-10-26
    相关资源
    最近更新 更多