使用 TypeScript React prop 类型 - 如何拥有函数类型?

2024-01-13

是否有使用 TypeScript 来使用 React prop types 的函数类型的最佳实践?

我以为这会起作用,但实际上它出错了:

type Props = {
  onClick: Function
};

const Submit = ({ onClick }: Props) => {
  return (
    <button type="button" onClick={onClick}>
      click me
    </button>
  );

按照这个线程,我让它工作了,但它似乎不必要地冗长:https://github.com/Microsoft/TypeScript/issues/20007 https://github.com/Microsoft/TypeScript/issues/20007

type Props = {
  onClick: (...args: any[]) => any;
};

const Submit = ({ onClick }: Props) => {
  return (
    <button type="button" onClick={onClick}>
      click me
    </button>
  );

关于Function和最佳实践

Function https://github.com/microsoft/TypeScript/blob/9ff24b6/lib/lib.es5.d.ts#L272-L304实际上,作为所有函数的超类型,类型安全性不足。你最好用一个替换它功能类型 https://www.typescriptlang.org/docs/handbook/functions.html#function-types- 请参阅下面的“解决方案”部分。

在上面的例子中,Function不可分配给更狭窄的onClick函数类型,这会导致手头的错误(游乐场示例 https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgIilQ3wChSYBPMJOABRzAGc4BeOAb1LjggDsAwgBtgaANYAuOADEArnwzB+pAL4Bucmn5N4AZVkAjEMHjsAFB16CR4uCqkMIzAJRsAfNzhnPPADwHZGBh+OCoaVnwAoP58K2FRMVYOfnjxFTc4AHpMuAB3YAATWgByOQUYJT5i0OpaPgh4FCYmYABzPhQDIVpguDQbMTgACxQ+Au6oHx4+gbgQJCnfTKjgvg8eZ3JsuE6IADdaYBYmFHm4JCgcKB2WGCHaTAghIQh8vlaJUi0+HTnKVLEAAlRuMLlIyooQuYkHspMh0DAAHQAWQgsiYSAAogc+DBXKwMhxvkwnkhES9WmZ8P0EkgCgBCfDOFRfbRYPhSMxmGFIXFw4hI1HorE4mC+QEAFWRABkAEKBVaY7rzXEAGjgQox2N5MDc+IyewghXxfwBwLGEyyOQuVyAA).

此外提到的问题, https://github.com/Microsoft/TypeScript/issues/20007#issuecomment-405766256这是什么TypeScript 文档 https://www.typescriptlang.org/docs/handbook/2/functions.html#function说关于Function:

这是一个无类型函数调用,通常最好避免,因为 any 返回类型不安全。如果需要接受任意函数但不打算调用它,则类型() => void一般来说比较安全。

typescript-eslint https://github.com/typescript-eslint/typescript-eslint has 丢弃的 Functionban-types https://github.com/typescript-eslint/typescript-eslint/blob/v4.4.0/packages/eslint-plugin/docs/rules/ban-types.md rule, 发出以下消息 https://github.com/typescript-eslint/typescript-eslint/blob/1cb8ca4/packages/eslint-plugin/src/rules/ban-types.ts#L74-L81使用默认配置(另请参阅here https://github.com/typescript-eslint/typescript-eslint/blob/v4.4.0/packages/eslint-plugin/docs/rules/ban-types.md#default-options):

The Functiontype 接受任何类似函数的值。它在调用函数时不提供类型安全,这可能是错误的常见来源。 如果您希望函数接受某些参数,则应该显式定义函数形状。

更好的解决方案

React 已经自带了内置事件处理程序类型 https://github.com/DefinitelyTyped/DefinitelyTyped/blob/927f70d/types/react/index.d.ts#L1303-L1316处理常见事件 https://reactjs.org/docs/events.html#supported-events.

For example click (Playground https://www.typescriptlang.org/play?#code/JYWwDg9gTgLgBAJQKYEMDG8BmUIjgIilQ3wChSYBPMJOABRzAGc4BeOAb1LjggDsAwgBtgaANYAuRMRgA6ALIQArkyQBRAG5I+MABIo+AEyFIoAHl0AVeQBkAQkpgx+akyG0wAfKQC+AbnI0fiZ4AGUlACMQYHh2AAoOXkERcTgfKQYIZgBKNm8eOO4eODMIx2c+OCoaVnwyp358JOFRMVYOfhbxH3zinjQUsTh3Ip4zAHp6it7soA):
type Props = {
  onClick: React.MouseEventHandler<HTMLButtonElement>
};

const Submit = ({ onClick }: Props) => <button onClick={onClick}> click </button>
A more general alternative is to use function types https://www.typescriptlang.org/docs/handbook/functions.html#function-types as follows:
type Props = { 
  onClick: (event: React.MouseEvent<HTMLElement>) => void
};

voidany。不可能意外地在回调中返回一个值,这可以通过any.

总之,我们拥抱 TypeScript 的打字功能,而不是使用Function or any。 现在已知参数为MouseEvent和返回类型void,将其识别为回调。

Related

Typescript:如何定义方法参数中使用的函数回调的类型(作为任何函数类型,不是通用的) https://stackoverflow.com/questions/29689966/typescript-how-to-define-type-for-a-function-callback-as-any-function-type-no

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TypeScript React prop 类型 - 如何拥有函数类型? 的相关文章

随机推荐

  • 非本机长度的有符号和无符号整数的性能差异

    有这样一段话 CppCon 2016 钱德勒 卡鲁斯 Chandler Carruth 垃圾进 垃圾出 争论未定义的行为 https youtu be yG1OZ69H o t 39m16s 其中 Carruth 先生展示了 bzip 代码
  • Angular UI 路由器无法使用 Internet Explorer 9 进行解析

    我有一个 Angular v1 3 应用程序 它使用 Angular ui router v0 2 13 进行所有路由 该网站在所有浏览器上都能正常运行 包括 IE 10 和 IE 11 但不能在 IE 9 上运行 我们决定不再使用 IE8
  • 带箭头顶部和边框的框

    我只是要在上面创建一个盒子 边缘有一个箭头 我经常尝试但不幸的是相关的解决方案 我自然而然地在网上和网站上查询 但遗憾的是没有成功 所以它应该照顾 箭头应具有与框相同的边框和相同的背景颜色 所以现在看起来 arrow up width 10
  • Xcode 4 对当前版本的 MonoTouch 有影响吗?

    安装 Xcode 4 安全吗 今天发布的 MonoTouch 将允许您安装 XCode 4 并继续使用 MonoTouch 构建应用程序 但如果您使用安装 XCode 4 您将无法编辑 XIB 文件 我们建议开发人员安装新的 XCode 3
  • 具有类继承的数据类字典

    我有以下课程 dataclass json dataclass class Input sources List Sources None Transformations List str None 也 dataclass json dat
  • 如何使用mutationobserver代替突变事件?

    我正在尝试使用 D3 js 创建我的第一个流图 我从一个工作示例开始 其中包含在线发布的代码中的工具提示 http bl ocks org WillTurman 4631136 http bl ocks org WillTurman 463
  • 设置电子邮件和浏览器的 tr 和 td 宽度和高度

    我正在制作 HTML 电子邮件 我想在发送之前在浏览器中预览它们 因此我希望它们在浏览器和电子邮件客户端中看起来相似 我尝试了多种方法来设置行和单元格的宽度和高度 table height 500 width 200 tr td heigh
  • Fabric.js:如何填充徒手路径来绘制形状?

    在fabric js中 我们可以徒手绘制路径 例如http fabricjs com freedrawing http fabricjs com freedrawing 但是 在 HTML canvas 2d context ctx 中 我
  • UnparsedFlagAccessError:在解析标志之前尝试访问标志 --preserve_unused_tokens。伯特

    我想使用 Bert 语言模型来训练多类文本分类任务 之前我使用 LSTM 进行训练 没有任何错误 但 Bert 给了我这个错误 我收到以下错误 我真的不知道如何解决它 有人可以帮助我吗 不幸的是 keras 库中使用 BERT 的文档很少
  • ModuleNotFoundError:没有名为“__main__.models”的模块; “__main__”不是一个包

    目前在 Django 网站上工作 我在从我的网站导入类及其属性时遇到问题models py模块到我的views py我的音乐应用程序中的模块 据我了解 Django 使用元类来构建模型 因此定义的字段最终不会作为类的属性 这是问题吗 如果是
  • 如何编写多线程单元测试?

    我想知道是否有一些单元测试框架能够轻松编写多线程测试 我会想象这样的事情 n个线程同时调用一个特殊的测试方法m次 所有测试线程完成后 将调用应验证某些约束的断言方法 我当前的方法是在 junit 测试方法中创建 Thread 对象 在每个
  • Google Chrome 与 Nodejs (v8) 的性能比较?

    Example console time Test for var i 0 i lt 2500000 i 1 loop around console timeEnd Test 上面的代码运行faster in nodejs than goo
  • Ruby 正则表达式:负匹配

    我想知道是否可以对整个单词使用否定匹配 这样就像 em lt em gt 会匹配一切 但之间 并包括 之间的文本 em em 我正在考虑使用负向前瞻 但我认为这不会起作用 因为我需要检查开口 em 以及 当然 我可以只使用正则表达式 然后从
  • Java:委托模式和受保护的方法

    我一直在使用委托模式将工厂创建的对象包装在第三方库中 最近 该库在基类中添加了受保护的方法 而我的包装类不再起作用 有没有人有一个好的解决方案而不诉诸反思 这是在第 3 方库及其包中 public class Base public voi
  • 通过扩展程序更改 Google chrome 主页

    无论如何 是否可以通过扩展程序更改 google chrome 主页 url 我正在尝试编写一个可以更改主页网址的简单扩展 希望你能帮我 这是可能的 快速搜索就会发现这样的扩展已经存在 https chrome google com web
  • xml2csv包错误'_IterParseIterator'对象没有属性'next'

    我正在使用 xmlutils 包将 xml 文件转换为 csv 我的代码如下 from xmlutils xml2csv import xml2csv as x input path media ishan Local Disk doc x
  • 线性回归中使用的显式公式

    我有一个公式列表 我使用lapply and lm创建回归模型列表 然而 当我看到call每个线性模型的组成部分 我看到的不是显式公式 而是解析到线性模型中的变量的名称 例如 使用 mtcars 数据集 temp formula list
  • dlib (setup.py) 循环的构建轮子

    尝试从 Ubuntu 安装 dlib 和face recognition 参考自https www learnopencv com install dlib on ubuntu https www learnopencv com insta
  • 为什么 Win32 API 中不使用标准数据类型? [复制]

    这个问题在这里已经有答案了 我学习 Visual C Win32 编程已经有一段时间了 为什么会有这样的数据类型DWORD WCHAR UINT等等用来代替 比如说 unsigned long char unsigned int等等 我必须
  • 使用 TypeScript React prop 类型 - 如何拥有函数类型?

    是否有使用 TypeScript 来使用 React prop types 的函数类型的最佳实践 我以为这会起作用 但实际上它出错了 type Props onClick Function const Submit onClick Prop