打字稿中函数上的“:”和“=>”有什么区别?

2023-12-28

假设我们使用这样的显式类型来定义一个函数,

var func : (arg1: string, arg2: number) => boolean;

正如你所看到的,我们应该在这里使用“=>”,但是我们不能在函数减速中使用这个粗箭头。

func = function name(arg1: string, arg2: number) : boolean {return true;}

但是在 lambda 函数中,例如我们使用“=>”这个粗箭头,为什么呢?

var lambdaFunc = (arg1: string, arg2: number) => true;

在函数类型接口中,为什么我们使用它,例如,我们使用“:”冒号。

interface SearchFunc {
(source: string, subString: string): boolean;
}

这整个混乱是关于什么的?


两种语法表示的内容(函数的返回值)没有区别,但一般来说,:语法用于函数中声明=>语法用于函数中表达式. (Read Javascript 函数声明与函数运算符 http://helephant.com/2012/07/14/javascript-function-declaration-vs-expression/了解这两件事之间的区别。)

冒号语法至少可以追溯到已废弃的 EcmaScript 4 规范,该规范引入了使用此语法的类型注释。箭头语法来自箭头函数表达式 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions在 EcmaScript 6 中,使用粗箭头符号作为函数“关键字”。箭头语法为使用冒号会产生歧义的地方提供了简写,并且在这些情况下通常更容易直观地解析。

例如,给定一个接受回调的函数,使用:如果不使用包装类型来表示回调的返回类型是不可能的{},但很简单=>:

// ambiguous parse, syntax error
function sendString(callback: (value: string): void);

// valid, using fat arrow
function sendString(callback: (value: string) => void);

// same thing, using curly brackets
// (harder to write, harder to parse visually)
function sendString(callback: { (value: string): void; });

在类中,可以对属于函数的类属性使用粗箭头语法,但不能对方法使用粗箭头语法,如下例所示:

class Foo {
  // In TypeScript’s eyes, this is actually a
  // property, not a method!
  someMethod: (value: string) => boolean;
}

在这种情况下,TypeScript 区分了特性一个类和methods一个类的。像这样定义为属性的函数不需要主体,但不能被覆盖或定义为子类中的方法。换句话说,即使签名是“兼容的”,你也不能这样做:

class Bar extends Foo {
  // nope!
  someMethod(value: string): boolean {
    return true;
  }
}

总之,由于类型语法在 TypeScript 中的工作方式,它是always可以对任何函数类型使用冒号语法,但它是not总是可以使用箭头语法。最重要的是编写清晰易读的代码,因此请使用最适合情况的语法。通常这意味着使用=>对于回调参数,以及:对于其他一切。

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

打字稿中函数上的“:”和“=>”有什么区别? 的相关文章

随机推荐

  • 检查context.Request.Body的条件是azure api管理策略中的JArray或JObject

    我正在使用 Azure API 管理策略表达式将供应商值发送到每个帖子 对后端 API 的放置和删除请求 我编写了一个代码 当请求类型为 JObject 时 该代码工作正常 但我有一些请求可以是 JArray 类型的情况 在这种情况下它会抛
  • 如何在IIS7中禁用应用程序池空闲超时?

    如果我将空闲超时设置为0 它会被禁用吗 是的 将空闲超时值设置为零将禁用空闲超时 奇怪的是 这没有记录在 MS 文档中 但我的证据来自 IIS 设置架构 如果您查看了 IIS 设置架构 C Windows System32 inetsrv
  • 如何安装:OpenSSL + WAMP

    这里有人有关于如何在我的本地开发计算机上获取 SSL 的清晰详细的步骤吗 我已在 c wamp 上安装了最新版本的 WAMP 2 2c 我在网上找到的说明在大多数情况下似乎已经过时 并且缺乏正确完成工作所需的详细信息 指南 WampServ
  • wl-pprint-extras 中的可选空格和多个替代项

    是否有一种好的 可接受的方法来获得两种以上的替代布局 特别是支持可选空间的方式 特别是 我可能想通过以下三种方式之一打印列表 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 按照该优先顺序 您可以先尝试一种替代方案 然后再尝试另
  • 从 FireWire 获取视频流

    我正在尝试通过 FireWire 将摄像机 Sony HVR Z1E 中的视频流式传输到我的计算机 传入的图片 流应由一些期望 CVMat 格式 来自 openCV 的函数进一步处理 好吧 我现在的问题是我不知道如何获取流 好吧 openC
  • Istio 分布式跟踪与 Jaeger 不起作用

    我正在尝试设置本地 k8s 集群minikube已安装istio我在使用 Jaeger 启用分布式跟踪时遇到问题 我有3个微服务A gt B gt C 我正在传播所需的所有标头 x request id x b3 traceid x b3
  • escapeshellarg 和 escapeshellcmd 有什么区别?

    PHP 有 2 个密切相关的函数 escapeshellarg http php net escapeshellarg and escapeshellcmd http php net escapeshellcmd 它们似乎都做类似的事情 即
  • super() 并更改协作方法的签名

    在多重继承设置中 例如所列出的 我该如何使用super 并处理层次结构中的类之间函数签名发生变化的情况 即我可以重写这个例子 在 python3 中 来使用super 例子取自文章super 被视为有害文章 https fuhm net s
  • 为什么在这个 Perl 示例中,defineed sdf 返回 true?

    我在 Perl 中尝试了这个例子 有人可以解释为什么这是真的吗 if defined sdf print true 它打印true sdf 可以是任何名称 另外 如果定义了 sdf 函数并且返回 0 则不会打印任何内容 print sdf
  • C++ 中的赋值运算符返回右值还是左值?

    C 中的赋值运算符返回右值还是左值 如果它是左值 那么两个参数中的哪一个将在这里递增 a b 它返回一个lvalue 根据第 5 17 条 赋值运算符 和复合赋值运算符 从右到左分组 全部都需要一个可修改的左值作为他们的左边 操作数并返回引
  • SQLServer连接预登录

    在 SQL Server 2000 中使用 Hibernate 时出现以下错误 Dec 12 2015 12 54 20 AM com microsoft sqlserver jdbc SQLServerConnection Prelogi
  • sys.dm_exec_sql_text 如何工作?

    你能解释一下原因吗 select from sys dm exec sql text sql handle 抛出错误 无效的列名 sql handle 但是 select from sys sysprocesses cross apply
  • 如何定义具有多个 OR 运算符的正则表达式,其中每个术语都包含空格前缀和后缀?

    我正在准备数据提取任务 我需要删除一组术语 每个源记录字符串中可以没有 部分或全部出现 有超过 100 000 条目标记录 我想避免执行单个术语匹配 替换操作 因为 a 要删除的术语列表可能会增长 并且 b 一次执行一个术语的当前匹配 替换
  • 如何在 R 中获得特定的彩色比例?

    我想使用看起来有点常见的色标 看看here https stackoverflow com questions 8421536 a true heat map in r and here http tctechcrunch2011 file
  • 按月计算 cumsum() 但如果该月没有数据则重复这些值

    我有数据 df date col1 col2 0 1 16 2016 apple 20 1 2 1 2016 apple 40 2 2 2 2016 pear 60 3 3 13 2016 apple 10 4 5 4 2016 apple
  • Java中如何从超类调用子类方法?

    我环顾四周 想找到问题的答案 但找不到 Java中如何从超类调用子类方法 基本上我想做的是这样的 我有一个名为exec这需要一个String作为命令的参数 我希望能够致电exec开发人员在事先不知道子类名称的情况下从超类重写的子类中的方法
  • 如何在android中捕获设备后退按钮事件?

    我通过我的应用程序打开了 pdf 文件 当单击设备后退按钮时 它会自动返回到我的应用程序 它工作正常 这里我想捕获设备中的后退按钮事件 我覆盖后退按钮 但它不起作用 请帮我 这是您所要求的示例 Override public boolean
  • Github Pages Jekyll 站点中的资产收到 404 错误

    我正在尝试在 github 页面上建立一个基本的 Jekyll 站点 目前有问题的网站是 https kculmback github io kcfeatures v2 https kculmback github io kcfeature
  • C printf 使用 %d 和 %f

    我正在研究这个程序 我注意到使用 f 表示双精度型 使用 d 表示浮点型给了我完全不同的东西 有人知道为什么会发生这种情况吗 int main float a 1F double b 1 printf float d ndouble f a
  • 打字稿中函数上的“:”和“=>”有什么区别?

    假设我们使用这样的显式类型来定义一个函数 var func arg1 string arg2 number gt boolean 正如你所看到的 我们应该在这里使用 gt 但是我们不能在函数减速中使用这个粗箭头 func function