首页 > 其他分享 >[React Typescript] Generic Inference through Multiple Type Helpers

[React Typescript] Generic Inference through Multiple Type Helpers

时间:2023-08-12 16:55:50浏览次数:43  
标签:Typescript Inference Generic value label ButtonGroup ButtonGroupProps type

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

interface Button<T> {
  value: T;
  label: string;
}

interface ButtonGroupProps<T> {
  buttons: Button<T>[];
  onClick: (value: T) => void;
}

const ButtonGroup = <T extends string>(props: ButtonGroupProps<T>) => {
  return (
    <div>
      {props.buttons.map((button) => {
        return (
          <button
            key={button.value}
            onClick={() => {
              props.onClick(button.value);
            }}
          >
            {button.label}
          </button>
        );
      })}
    </div>
  );
};

<>
  <ButtonGroup
    onClick={(value) => {
      type test = Expect<Equal<typeof value, "add" | "delete">>;
    }}
    buttons={[
      {
        value: "add",
        label: "Add",
      },
      {
        value: "delete",
        label: "Delete",
      },
    ]}
  ></ButtonGroup>
</>;

 

It is important to use  <T extends string>, otherwise Typescript cannot infer the exact value

The type flow down from ButtonGroup to Button, infer the value of `add | delete`, then bubble up to ButtonGroupProps, set onClick(value: T); then bubble up to ButtonGroup component, set generic type T.

标签:Typescript,Inference,Generic,value,label,ButtonGroup,ButtonGroupProps,type
From: https://www.cnblogs.com/Answer1215/p/17625038.html

相关文章

  • [React Typescript] Passing Type Arguments To Components
    import{ReactNode}from"react";import{Equal,Expect}from"../helpers/type-utils";interfaceTableProps<T>{rows:T[];renderRow:(row:T)=>ReactNode;}exportconstTable=<T,>(props:TableProps<T>......
  • [React Typescript] Generics in Class Component
    interfaceTableProps<T>{rows:T[];renderRow:(row:T)=>ReactNode;}exportclassTable<T>extendsReact.Component<TableProps<T>>{render():ReactNode{return(<table><tbody>......
  • 开心档之TypeScript String(字符串)
    TypeScriptString(字符串)目录TypeScriptString(字符串)语法String对象属性String方法String对象用于处理文本(字符串)。语法vartxt=newString("string");或者更简单方式:vartxt="string";String对象属性下表列出了String对象支持的属性:序号属性&描述实例1.constructor......
  • typeScript学习-TS类型-null和undefined
    typeScript学习null和undefinedundefinedanyunknown 可以接受undefinedletdata:undefined=undefinedletdata2:any=undefinedletdata3:unknown=undefined nullanyunknown 可以接受nullletdata4:null=nullletdata5:any=nullletd......
  • TypeScript第三章
    TypeScript是一个由微软开发的开源编程语言,它是JavaScript的超集,意味着TypeScript包含了JavaScript的所有特性,同时还提供了一些新的特性和语法糖。TypeScript可以帮助开发者在开发大型应用时提高代码可维护性、可读性和可靠性。本文将介绍TypeScript的一些进阶使用方法,并......
  • typeScript学习-TS类型-其他特殊类型-any、unknown
    typeScript学习其他特殊类型:any,unknown,never,void,元组(tuple),可变元组 any比较经典的应用场景:1、自定义守卫2、需要进行asany类型断言的场景unknown一般用作函数参数:用来接收任意类型的变量实参,但在函数内部只用于再次传递或输出结果,不获......
  • typeScript学习-TS类型-其他特殊类型-never
    typeScript学习其他特殊类型:any,unknown,never,void,元组(tuple),可变元组never://dataFlowAnalysisWithNever方法穷尽了DataFlow的所有可能类型。//使用never避免出现未来扩展新的类没有对应类型的实现,目的就是写出类型绝对安全的代码。typeDataFlow=stri......
  • typeScript学习-TS类型-合成类型
    typeScript学习合成类型:联合类型,交叉类型联合类型:letstr:srting|number="abc"str=3交叉类型:typeObj1={username:string}typeObj2={age:number}letobj:Obj1={username:'zhangsan'}letobj2:Obj2={age:23}letobj3:Obj1&Obj2={username:&#......
  • typeScript学习-TS类型-字面量数据类型
    typeScript学习字面量数据类型://typeA=number|string//leta:A="abc"//typenum=number//letn:num=3typenum=1|2|3letn:num=2//错误情况//letn:num=4typeincreaseFlag=0|1functionisStartUp(increase:increaseFlag){if(in......
  • typeScript学习-TS类型-枚举
    typeScript学习枚举:enum枚举的定义:用来存放一组固定的常量的序列。枚举带来的好处:1、有默认值和可以自增值,节省编码时间2、语义更清晰,可读性增强,因为枚举是一种值类型的数据类型,方法参数可以明确参数类型为枚举类型enumWeekEnd{Monday="myMonday",//......