React 与 TS 结合使用时的技巧总结

news/2024/7/15 18:36:30 标签: react.js, 前端, 笔记, 学习

使用 TS 泛型来定义通用参数

有些时候会遇到有些业务页面结构是通用的,只是传入页面组件的参数略有不同,这样我们可以使用 TS 的泛型来定义通用参数。具体的实例如下:

type GenericPropsData<T> = {
  items: T[];
  onClick: (value: T) => void;
};

const GenericProps: React.FC<GenericPropsData<number | string>> = ({
  items,
  onClick,
}) => {
  return (
    <div>
      <h2>TS 泛型定义参数</h2>
      {items.map((item) => {
        return (
          <div key={item} onClick={() => onClick(item)}>
            {item}
          </div>
        );
      })}
    </div>
  );
};

export default GenericProps;

上述例子中,只是简单列举了泛型为数字或者字符串,泛型还可以定位为其他对象。

使用 TS 限定传入的参数

有些业务场景要求根据在一定条件下传入对应参数,组件中的其他参数为不能传递的情况,或者出现类型的情况时,我们可以考虑使用 TS 的never联合类型来声明定义参数的组件。具体实例如下:

type RandomNumberType = {
  value: number;
};

type PositiveNumber = RandomNumberType & {
  isPositive: boolean;
  isNegative?: never;
  isZero?: never;
};

type NegativeNumber = RandomNumberType & {
  isNegative: boolean;
  isPositive?: never;
  isZero?: never;
};

type Zero = RandomNumberType & {
  isZero: boolean;
  isPositive?: never;
  isNegative?: never;
};

type RandomNumberProps = PositiveNumber | NegativeNumber | Zero;

const RestrictionProps: React.FC<RandomNumberProps> = ({
  value,
  isPositive,
  isNegative,
  isZero,
}) => {
  return (
    <div>
      {value} {isPositive && "整数"} {isNegative && "负数"} {isZero && "0"}
    </div>
  );
};

export default RestrictionProps;

使用 TS 的 Exclude 去除某些联合类型

我们可以使用 TS 中的 Exclude 来去除某些联合类型的参数,例如下面实例:

type HorizontalPosition = "left" | "center" | "right";
type VerticalPosition = "top" | "center" | "bottom";

/**
 * 组件传入的参数可以有如下这些
 * "left-center" | "left-top" | "left-bottom" | "center" | "center-top" |
 * "center-bottom" | "right-center" | "right-top" | "right-bottom"
 *
 * 我们通过Exclude抛掉了center-center的值
 */
type ToastProps = {
  position:
    | Exclude<`${HorizontalPosition}-${VerticalPosition}`, "center-center">
    | "center";
};

const ExcludeProps: React.FC<ToastProps> = ({ position }) => {
  return <div>Toast Notification Position - {position}</div>;
};

export default ExcludeProps;

使用 TS 实现多态组件

type TextOwnProps<E extends React.ElementType> = {
  size?: "sm" | "md" | "lg";
  color?: "primary" | "secondary";
  children: React.ReactNode;
  as?: E;
};

type TextProps<E extends React.ElementType> = TextOwnProps<E> &
  Omit<React.ComponentProps<E>, keyof TextOwnProps<E>>;

const PolymorphismProps: React.FC<TextProps<React.ElementType>> = ({
  size,
  color,
  children,
  as,
}) => {
  const Component = as || "div";
  return (
    <Component className={`class-with-${size}-${color}`}>{children}</Component>
  );
};

export default PolymorphismProps;

http://www.niftyadmin.cn/n/5013568.html

相关文章

Dominosa/数邻(1) | C++ | 结构体和类

这里是目录 一、背景介绍二、题目描述三、Dominosa 的技巧&#xff1f;四、编程思路五、完整代码六、补充 一、背景介绍 你玩过骨牌吗&#xff1f;至少你一定听说过或者亲眼见过多米诺骨牌&#xff0c;而多米诺骨牌就发展自骨牌&#xff0c;这是一种古老的游戏&#xff0c;而我…

【C++二叉树】进阶OJ题

【C二叉树】进阶OJ题 目录 【C二叉树】进阶OJ题1.二叉树的层序遍历II示例代码解题思路 2.二叉搜索树与双向链表示例代码解题思路 3.从前序与中序遍历序列构造二叉树示例代码解题思路 4.从中序与后序遍历序列构造二叉树示例代码解题思路 5.二叉树的前序遍历&#xff08;非递归迭…

Java垃圾回收提问的逐步深入,你能 闯过第几轮?

1.Java垃圾回收机制是什么&#xff1f;能否简要解释一下&#xff0c;并提到一些常见的垃圾回收器&#xff1f; 标准回答&#xff1a; Java垃圾回收机制是一种自动管理内存的机制&#xff0c;它负责检测和清理不再被程序使用的对象&#xff0c;以释放内存空间。常见的垃圾回收器…

怎么扫码听音频?音频在线生码的方法

现在很多小伙伴喜欢听书而不是自己看&#xff0c;那么当我们想分享一段听书音频时&#xff0c;有什么的方法能够更快更好地来让其他人获取内容呢&#xff1f;想要提高传播的效率&#xff0c;那么制作音频二维码&#xff08;音视频二维码制作-一键免费生成音视频二维码在线工具-…

centos7使用docker-compose一键搭建mysql高可用主从集群

docker部署 环境准备 卸载旧版本 yum remove -y docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine 安装依赖 yum install -y yum-utils \…

蠕虫病毒流量分析案例

背景 某供排水集团的网络管理员对其网络的健康状况持认可态度&#xff0c;表示网络运行正常&#xff0c;没有发现异常行为。然而&#xff0c;由于网络环境变得越来越复杂&#xff0c;仅凭借传统的网络经验已经不能全面了解网络情况。因此&#xff0c;我们为供排水集团安装了Ne…

通过 http-server 运行刚打包出来的脚手架项目

这里 我打包了自己的vue项目 react其实也一样 如果我直接 打开打包出来的 dist 下面的index.html 会出现白屏资源找不到 或者跨域等问题 这个问题其实配个nginx也能解决 但是其实如果只是想做个测试 nginx就太麻烦了 我们可以通过npm指令 全局安装一个http-server 终端执行 …

2023秋冬系列丨追求本真的自然纯粹之美

2023年08月&#xff0c;上海&#xff0c;ZESH泽尚&#xff0c;中国轻奢皮具品牌宣布推出2023全新秋冬系列包袋&#xff0c;以“自然之道&#xff0c;纯粹之美”为主题重新定义东方美学。品牌建立之初就坚持贯彻东方美学设计与精湛制作工艺融合的理念。此次秋冬系列从中式禅宗学…