首页 > 其他分享 >[React Typescript] Strongly type Shared props for multiple components (React.FC<propsType>)

[React Typescript] Strongly type Shared props for multiple components (React.FC<propsType>)

时间:2023-08-29 14:46:13浏览次数:43  
标签:Strongly Typescript return React FC props const type

import { Equal, Expect } from "../helpers/type-utils";

type InputProps = React.ComponentProps<"input">;

const COMPONENTS = {
  text: (props) => {
    return <input {...props} type="text" />;
  },
  number: (props) => {
    return <input {...props} type="number" />;
  },
  password: (props) => {
    return <input {...props} type="password" />;
  },
} satisfies Record<string, (props: InputProps) => JSX.Element>;

export const Input = (
  props: Record<"type", keyof typeof COMPONENTS> & InputProps
) => {
  const Component = COMPONENTS[props.type];
  return <Component {...props} />;
};

<>
  <Input
    type="number"
    onChange={(e) => {
      // e should be properly typed!
      type test = Expect<Equal<typeof e, React.ChangeEvent<HTMLInputElement>>>;
    }}
  ></Input>
  <Input type="text"></Input>
  <Input type="password"></Input>

  {/* @ts-expect-error */}
  <Input type="email"></Input>
</>;

 

  • Get the props for input, we can using React.ComponentProps<"input">
  • Improve: (props: InputProps) => JSX.Elementto React.FC<InputProps>
const COMPONENTS = {
  text: (props) => {
    return <input {...props} type="text" />;
  },
  number: (props) => {
    return <input {...props} type="number" />;
  },
  password: (props) => {
    return <input {...props} type="password" />;
  },
} satisfies Record<string, React.FC<InputProps>>;

 

标签:Strongly,Typescript,return,React,FC,props,const,type
From: https://www.cnblogs.com/Answer1215/p/17664707.html

相关文章

  • 【数据结构与算法】TypeScript 实现图结构
    classGrapg<T>{//用于存储所有的顶点verteces:T[]=[];//用于存储所有的边采用邻接表的形式adjList:Map<T,T[]>=newMap();//添加顶点addVertex(v:T){this.verteces.push(v);//初始化顶点的邻接表this.adjList.set(v,[]);}......
  • [React Typescript] Strongly type Render prop
    1.React.ReactNodeimport{useState}from"react";import{createPortal}from"react-dom";import{Equal,Expect}from"../helpers/type-utils";interfaceModalChildProps{isOpen:boolean;openModal:()=>void;......
  • ref() reactive() 声明响应式状态
    ref函数 使用ref函数将普通数据变成响应式数据reactive函数 把对象和数组这类复合数据类型数据变成响应式数据<template> <span> <spanid="num">{{num}}</span> <inputtype="button"value="+1"@click="f1"> <ul> <liv......
  • [React Typescript] Strongly Typing Lazy Loaded Components with Generics
    Navigatingtothetypedefinitionfor lazy by CMD+click inlocalVSCode,orinthe DefinitelyTyped repo.Wecanseethefollowingdefinition:functionlazy<TextendsComponentType<any>>( factory:()=>Promise<{default:T}>):L......
  • TypeScript – Decorator Metadata
    前言在 TypeScript–Decorator装饰器 里,我有提到TypeScript只实现了decorate的特性,把metadata的特性独立了出来。本来我以为还需要等待很长的时间他们才会实现,没想到v5.2既然推出了。哎哟,不错哦!声明:Decorator不是TypeScript语法,它是ECMAScript(AKAJavaScr......
  • TypeScript – Using Disposable
    前言TypeScriptv5.2多了一个新功能叫 Disposable。Dispose的作用是让"对象"离开"作用域"后做出一些"释放资源"的操作。很多地方都可以看到 Dispose概念。比如WebComponent的 disconnectedCallback,Angular组件的 ngOnDestroy。而对象释放资源在其它面向对象......
  • React加载组件后自动触发某函数,而不需要点击按钮
    问题在项目中使用了ReactToPrint来实现打印,但是trigger属性中的按钮需要点击才能执行打印。期望能在组件加载完成时自动执行打印方法。解决可在组件加载完成时,通过id获取组件,并执行该组件的click方法。代码如下:importReact,{useRef,useEffect}from'react';//.........
  • TypeScript – 冷知识
    当genericreturn遇上parameter 报错了。原因是querySelector默认返回类型是抽象的Element。而method参数要求的是具体的InputElement解决方法是传入具体的InputElement类型constinput=document.querySelector<HTMLInputElement>('.input')!;但这不是重点......
  • react hooks中使用promise.all
    useEffect(async()=>{constgetFirstResponse=async()=>{try{returnawaitaxios.get('http://first-api',{params:{carId:id},});}catch(error){returnerror;}};......
  • react-pdf在部分iOS手机上加载pdf失败问题解决
    最近项目快结束了,测试提了一个bug,iOS手机上加载pdf一直在转圈,加载不出来内容。看到这个bug,在电脑上和安卓手机上没有问题,iOS手机中打开确实又问题,初步确定为app问题。我们的项目是集成在客户的app里的,可能是app内的WebView和Safari有一些差异导致的问题。首先直接在iOS手机上用a......