在 onClick 道具中使用联合类型

Posted

技术标签:

【中文标题】在 onClick 道具中使用联合类型【英文标题】:use union type in onClick prop 【发布时间】:2021-09-27 01:11:02 【问题描述】:

我正在使用 react 和 typescript 我有一个接口,我在那个文件中定义了我的类型。在这个文件中我有一个 onClick 属性。这个接受了一个函数作为值。我的问题是如何为我的 onclick 定义函数重载prop.eg:onClick:()=>void | (数字)=> 无效 ETC。 这是我的界面文件。换句话说,我希望我的 onClick 道具像我的颜色道具一样可以接受联合类型。

import React from "react";

export interface IButtonText 
    children: React.ReactNode;
    leadingIcon: React.ReactNode;
    className: string;
    color: 'primary' | 'secondary';
    onClick: ()=>void;

【问题讨论】:

【参考方案1】:

只是缺少括号:

export interface IButtonText 
    ...
    onClick: (() => void) | ((num: number) => void);

但这可能是更好的选择:

export interface IButtonText 
    ...
    onClick: (num?: number) => void;

【讨论】:

【参考方案2】:

联合类型产生错误


interface IButtonText 
    onClick: (() => void) | ((num: number) => void);



const foo = (props: IButtonText) => 
    props.onClick() // error, but should be ok


您正在寻找交集而不是联合。

函数的交集产生函数重载。

考虑这个例子:



interface IButtonText 
    onClick: (() => void) & ((num: number) => void);



const foo = (props: IButtonText) => 
    props.onClick() // ok
    props.onClick(2) // ok


这种方法onClick: (num?: number) => void; 在这种情况下是完全有效的,但是如果联合中有两个以上的元素,则很难用可选参数编​​写正确的函数类型

【讨论】:

@Poldark 这篇文章可能对你有所帮助dev.to/captainyossarian/how-to-type-react-props-as-a-pro-2df2

以上是关于在 onClick 道具中使用联合类型的主要内容,如果未能解决你的问题,请参考以下文章

在具有默认值的反应道具中使用区分联合

用于道具的 TypeScript 条件类型

如何使用 onClick 方法通过 react-router 传递道具

React-Native-Video onClick() 道具

在父组件的 onClick 上一次又一次地添加子组件,每次使用新的道具到子组件

React:每次渲染都会调用 onClick 处理程序?