当前位置:首页 > 科技  > 软件

慎用!!!不要在Typescript中使用Function类型

来源: 责编: 时间:2023-09-28 10:07:43 413观看
导读原文链接:https://www.totaltypescript.com/dont-use-function-keyword-in-typescript翻译:一川在Typescript中不应该使用Function作为一个类型,因为它可以表示任何函数。通常,我们期望的是更具体的类型--例如指定参数的

原文链接:https://www.totaltypescript.com/dont-use-function-keyword-in-typescriptYGJ28资讯网——每日最新资讯28at.com

翻译:一川YGJ28资讯网——每日最新资讯28at.com

在Typescript中不应该使用Function作为一个类型,因为它可以表示任何函数。通常,我们期望的是更具体的类型--例如指定参数的数量或函数返回的内容。如果确实要表示可以接受任意数量的参数并返回任何类型的函数,请使用 (...args: any[]) => any。YGJ28资讯网——每日最新资讯28at.com

1、完整的解释

假设您正在创建一个汇总对象数组的函数。这是一个,取自Excalidraw代码库:YGJ28资讯网——每日最新资讯28at.com

const sum = <T>(  array: readonly T[],  mapper: (item: T) => number): number =>  array.reduce(    (acc, item) => acc + mapper(item),    0  );

让我们看一下类型定义。此函数包含:YGJ28资讯网——每日最新资讯28at.com

  • 只读数组:readonly T[]
  • 映射器函数:(item: T) => number

并返回 number类型。YGJ28资讯网——每日最新资讯28at.com

在主体中,它调用array.reduce(func, 0)。这意味着在accYGJ28资讯网——每日最新资讯28at.com

对于数组的每个成员,它通过将acc和mapper(item)进行相加,最终得到数组所有成员的总和。YGJ28资讯网——每日最新资讯28at.com

2、什么可以用来作为函数声明?

mapper函数是关键。我们来剥离一下来看看:YGJ28资讯网——每日最新资讯28at.com

type Mapper<T> = (item: T) => number;

让我们想象一个用例:YGJ28资讯网——每日最新资讯28at.com

interface YouTubeVideo {  name: string;  views: number;} const youTubeVideos: YouTubeVideo[] = [  {    name: "My favorite cheese",    views: 100,  },  {    name: "My second favorite cheese (you won't believe it)",    views: 67,  },]; const mapper: Mapper<YouTubeVideo> = (video) => {  return video.views;}; const result = sum(youTubeVideos, mapper); // 167

3、关于什么是函数?

我看到很多初学者开发人员犯的一个大错误,声明一个类似于 mapper和Function类型 的函数:YGJ28资讯网——每日最新资讯28at.com

const sum = <T>(  array: readonly T[],  mapper: Function): number =>  array.reduce(    (acc, item) => acc + mapper(item),    0  );

这个关键字基本上代表“任何函数”。这意味着从技术上讲可以 sum 接收任何函数。YGJ28资讯网——每日最新资讯28at.com

当在 中使用 sum 时,我们失去了很多 (item: T) => number 提供的安全性:YGJ28资讯网——每日最新资讯28at.com

const result = sum(youTubeVideos, (item) => { // Parameter 'item' implicitly has an 'any' type.  // We can return anything from here, not just  // a number!  return item.name;});

TypeScript 现在无法推断应该是什么 item ,或者我们的mapper函数应该返回什么。YGJ28资讯网——每日最新资讯28at.com

这里的教训是“不要使用 Function ” - 总有一个更具体的选项可用。YGJ28资讯网——每日最新资讯28at.com

4、表示“任何函数”

有时,期望在typescript中表示“任何函数”,为此,让我们看一下 TypeScript 的一些内置类型Parameters 以及 ReturnType。YGJ28资讯网——每日最新资讯28at.com

export type Parameters<  T extends (...args: any) => any> = T extends (...args: infer P) => any  ? P  : never; export type ReturnType<  T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

您会注意到这两种实用程序类型使用相同的约束:(...args: any) => any 。YGJ28资讯网——每日最新资讯28at.com

(...args: any)指定函数可以接受任意数量的参数,=> any 表示它可以返回任何内容。YGJ28资讯网——每日最新资讯28at.com

5、表示没有参数的函数

要表达一个没有参数的函数(但返回任何内容),您需要使用() => any:YGJ28资讯网——每日最新资讯28at.com

const wrapFuncWithNoArgs = (func: () => any) => {  try {    return func();  } catch (e) {}}; wrapFuncWithNoArgs((a: string) => {});> Argument of type '(a: string) => void' is not assignable to parameter of type '() => any'.> Target signature provides too few arguments. Expected 1 or more, but got 0.

6、总结

Function不应该用作表示函数类型。当您只想指定参数而不指定返回类型时,可以使用语法(a: string, b: number) => any。YGJ28资讯网——每日最新资讯28at.com

记住,(...args: any) => any 可用于表示任何函数类型。YGJ28资讯网——每日最新资讯28at.com

此处,mapper 表示从对象中提取数字的函数。该 sum 函数的强大之处在于您可以丢弃大多数此类声明:YGJ28资讯网——每日最新资讯28at.com

const youTubeVideos = [  { name: "My favorite cheese", views: 100 },  {    name: "My second favorite cheese (you won't believe it)",    views: 67,  },]; const result = sum(youTubeVideos, (video) => {  return video.views;}); // 167

事实上,我们已经舍弃了所有类型声明,但 video仍旧被推断为 { name: string; views: number } 。这是可能的,因为我们的函数定义的特殊性:(item: T) => number 。YGJ28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-11839-0.html慎用!!!不要在Typescript中使用Function类型

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 水印艺术创造:逐步学习Python中的添加水印精华

下一篇: 实用!Python数据排序与排名:轻松找到最值与排名

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top