TypeScript,终于在实际项目中用到了泛型。

news2024/11/27 21:36:58

终于在实际项目中用到了泛型

里程碑式的纪录,终于不是anyScript了,代码写完只有一个any

应用

项目中组件化了这么一个东西
在这里插入图片描述
功能描述:

  1. 传进去一个数组,有个名,有个key,渲染成上图的div样式
  2. 点击之后,回调函数吐出点击的是哪一项

看下代码⬇️

import { useState } from 'react';
import styles from './index.less';

type Data = {
  key: string;
  name: string;
};

interface ButtonsGroupProps {
  data: Data[];
  defaultActive?: number;
  clickButtonCallback: (data: Data) => void;
}

const Index = (props: ButtonsGroupProps) => {
  const { data, defaultActive = 0, clickButtonCallback } = props;
  const [activeButton, setActiveButton] = useState(defaultActive);
  return (
    <div className={styles.buttonGroupWrapper}>
      {data.map((i, index) => (
        <div
          className={`${
            activeButton === index ? styles.buttonItemActive : ''
          } ${styles.buttonItem}`}
          key={i.key}
          onClick={(e) => {
            e.stopPropagation();
            setActiveButton(index);
            clickButtonCallback(i);
          }}
        >
          {i.name}
        </div>
      ))}
    </div>
  );
};

export default Index;

再看下外面怎么用:

type TypeKey = 'zj' | 'zh';
const buttonGroup = useMemo<{ key: TypeKey; name: string }[]>(
 () => [
   {
     key: 'zj',
     name: '资金',
   },
   {
     key: 'zh',
     name: '账户',
   },
 ],
 [],
);
 <ButtonGroup
   data={buttonGroup}
   clickButtonCallback={(data) => {
     setCurrentType(data.key as TypeKey);
   }}
 />

问题出现了

setCurrentType(data.key as TypeKey);
在这里插入图片描述
原因:

返回的key在是string,而用的时候定义了TypeKey

在这里插入图片描述

为啥要定义TypeKey而不直接string呢?
外面的key定义了文字字符串类型,因为不多,所以定死感觉比较好。
在这里插入图片描述
然后又来一个type TypeKey = 'ys' | 'yf';

虽然as也没有问题,肯定会是TypeKey。但是强迫症感觉有点难受

这时候就想到了泛型

组件内进行改造⬇️
首先Key的类型

type Data<T> = {
  key: T;
  name: string;
};

然后props的类型

interface ButtonsGroupProps<T> {
  data: Data<T>[];
  defaultActive?: number;
  clickButtonCallback: (data: Data<T>) => void;
}

最后函数接受一下T,

const Index = <T extends React.Key>(props: ButtonsGroupProps<T>) => {
  const { data, defaultActive = 0, clickButtonCallback } = props;
  const [activeButton, setActiveButton] = useState(defaultActive);
  return (
    <div className={styles.buttonGroupWrapper}>
      {data.map((i, index) => (
        <div
          className={`${
            activeButton === index ? styles.buttonItemActive : ''
          } ${styles.buttonItem}`}
          key={i.key}
          onClick={(e) => {
            e.stopPropagation();
            setActiveButton(index);
            clickButtonCallback(i);
          }}
        >
          {i.name}
        </div>
      ))}
    </div>
  );
};

export default Index;

Okk,在看一下外面
在这里插入图片描述
吐出来的也是T了,就不需要as


感谢观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Triple 协议支持 Java 异常回传的设计与实现

作者&#xff1a;陈景明 背景 在一些业务场景&#xff0c;往往需要自定义异常来满足特定的业务&#xff0c;主流用法是在catch里抛出异常&#xff0c;例如&#xff1a; public void deal() {try{//doSomething ...} catch(IGreeterException e) {...throw e;} }或者通过…

Python面向对象(九)

python学习之旅(九) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是面向对象 万物皆对象 现实世界的事物都有属性和行为,可在程序中抽离为类来描述现实世界的事物属性和行为。 使用类充当程序内现实事物的“设计图纸”&#xff0c;基于图纸(类)生产实体…

10. 正则表达式匹配

题目链接&#xff1a;https://leetcode.cn/problems/regular-expression-matching/从暴力递归到动态规划&#xff0c;对于状态转移方程不容易推导出来的可以先从递归进行尝试各种策略&#xff0c;最后再从暴力递归转为动态规划&#xff0c;这种尝试方式容易求解dp初始值以及dp更…

数据结构-考研难点代码突破 (图关键路径完全解析(流程+代码) - C++代码)

考研在关键路径上的考察以流程为主 文章目录1. AOE网2. 关键路径问题解决流程C代码1. AOE网 首先区分AOV网&#xff1a; AOV网∶若用DAG 图&#xff08;有向无环图&#xff09;表示一个工程&#xff0c;其顶点表示活动&#xff0c;用有向边<Vi&#xff0c;Vj>表示活动 V…

【ESP32+freeRTOS学习笔记-(五)队列Queue】

目录1、什么是队列Queue2、队列的多任务特性2.1 多任务的访问&#xff1a;2.2 队列读取阻塞&#xff1a;2.3 写队列阻塞&#xff1a;2.4 阻塞于多个队列&#xff1a;3、队列的使用3.1 创建队列--The xQueueCreate() API3.2 写入队列3.3 从队列中接收数据3.4 删除队列4、队列集4…

ReactDOM.render在react源码中执行之后发生了什么?

ReactDOM.render 通常是如下图使用&#xff0c;在提供的 container 里渲染一个 React 元素&#xff0c;并返回对该组件的引用&#xff08;或者针对无状态组件返回 null&#xff09;。本文主要是将ReactDOM.render的执行流程在后续文章中会对创建更新的细节进行分析&#xff0c…

MATLAB-plot3/ezplot3三维绘图

&#xff08;1&#xff09; plot3是三维绘图的基本函数&#xff0c;调用格式如下。1、plot3( X,Y,Z):绘制简单的三维曲线&#xff0c;当X、Y、Z是长度相同的向量时&#xff0c;plot3命令将绘制以向量X、Y、Z为(x, y,z)坐标值的三维曲线;当X、Y、Z是mn矩阵时,plot3命令将绘制m条…

Android 虚拟分区详解(四) 编译开关

Android Virtual A/B 系统简称 VAB,我将其称为虚拟分区。 本系列文章基于 Android R(11) 进行分析,如果没有特别说明,均基于代码版本 android-11.0.0_r46 请已经购买《Android 虚拟分区》专栏的朋友加我 wx 进 "虚拟分区专栏 VIP 答疑"群,作为本专栏文章的附加服…

(6)元对象系统与信号与槽机制

1. 元对象系统 元对象系统是一个基于标准C的扩展&#xff0c;为Qt提供了信号与槽机制、实时类型信息、动态属性系统。 什么是元对象 在计算机科学中&#xff0c;元对象是这样一个东西&#xff1a;它可以操纵、创建、描述、或执行其他对象。元对象描述的对象称为基对象。元对象可…

记一次搭建备库,使用连接串主库无法连接到备库

主库使用连接串连接备库失败 SQL> conn sys/oracleorcldg as sysdba ERROR: ORA-12528: TNS:listener: all appropriate instances are blocking new connections 备库已经建立了静态监听 # listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/…

安全寒假第一堂课

一、状态码 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 1xx&#xff08;临时响应&#xff09; 表示临时响应并需要请求者继续执行操作的状态码。 100&#xff08;继续&#xff09; 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一…

OpenCV实战(5)——图像运算详解

OpenCV实战&#xff08;5&#xff09;——图像运算详解0. 前言1. 图像基本运算2. 重载图像运算符2.1 加法运算符重载2.2 分割图像通道2.3 完整代码3. 图像重映射3.1 OpenCV 重映射函数3.2 完整代码小结系列链接0. 前言 图像可以以不同的方式进行组合&#xff0c;因为它们是正则…

XGBoost论文阅读

XGBoost: A Scalable Tree Boosting System 目录 XGBoost: A Scalable Tree Boosting System 1.摘要 2.方法 2.1 正则化学习目标 2.2 梯度提升树 2.3 收缩率和列采样 2.4分裂点查找算法 1.摘要 提出了一种新的稀疏性感知算法&#xff0c;用于稀疏数据和加权全图草图&a…

Python教程:什么是三级模式和二级映像?

美国国家标准学会(American National Standards Institute,ANSI)所属的标准计划与需求委员会&#xff08;Standards Planning and Requirements Committee,SPARC)在1971年公布的研究报告中提出了ANSI-SPARC体系结构&#xff0c;即三级模式结构&#xff08;或称为三层体系结构&a…

ArcGIS基础实验操作100例--实验53导出线、面要素的坐标值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验53 导出线、面要素的坐标值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xf…

笔记杂项(一)

都是踩过的坑&#xff0c;趟过的水。 ubuntu虚拟机终端字体太小的设置方法&#xff1a;ubuntu18.04调整终端字体大小 这个方法试试看&#xff1a;https://zhuanlan.zhihu.com/p/139305626 容器里面编译内核代码&#xff0c;进程被杀掉的原因是触发了内核OOM killer&#xff0c…

干货| app自动化测试之Andriod微信小程序的自动化测试

随着微信小程序的功能和生态日益完善&#xff0c;很多公司的小程序项目页面结构越来越多&#xff0c;业务逻辑也越来越复杂。如何做好小程序的自动化测试就成为测试同学普遍面临的一大痛点难题。微信小程序小程序内嵌于微信内部&#xff0c;页面包含 Native 原生元素和 Web 元素…

华为防火墙与二层交换机对接配置VLAN上网设置

拓扑图 一、防火墙设置 1、G1/0/0接口设置IP&#xff0c;G1/0/1接口切换二层口设置VLAN&#xff0c;G1/0/0 桥接了本地无线网卡来模拟公网地址 <USG6000V1>sys [USG6000V1]sys FW1 [FW1]un in en# 设置公网IP [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip addr 192.1…

package.json配置解读之入门

文章目录前言一、描述配置nameversionrepositorydescriptionkeywordslicenseauthor二、文件配置filestypemainbrowsermoduleexportsworkspaces三、脚本配置scriptsconfig四、结语前言 package.json是每个前端项目都会有的json文件&#xff0c;位于项目的根目录中。很多脚手架在…

RHCE(chrony服务器)

chrony服务器 chrony服务器是一个开源自由的网络时间协议NTP的客户端和服务器的软件&#xff0c;他能让计算机保持系统时钟和时钟服务器保持同步&#xff0c;让计算机保持精确的时间&#xff0c;chrony也可以作为服务端软件为其他计算机提供时间同步服务 chrony由两部分组成&…