TypeScript 异步代码类型技巧

  在typescript下编写异步代码,会遇到难以自动识别异步返回值类型的情况,本文介绍一些技巧,以辅助编写更健全的异步代码。

  callback

  以读取文件为例:

  

  readFile是一个异步函数,包含path和callback两个参数,callback的不进行声明类型的情况下,调用readFile后传入的callback无法正确识别到callback的err和rst的类型。通常在这种情况下,使用者很容易出现错用参数的情况,例如把rst当成一个字符串使用等。有了上面的类型描述后,下面的两种调用就能让编译器自动检测出错误:

  

  

  

  Promise

  一些可以将异步结果通过promise包装起来的函数,typescript的初学者可能一时找不到方法去描述Promise的异步结果类型。其实官方的描述文档中已经提供了Promise的相关描述。并提供了泛型描述接口Promise<type>来描述其异步的返回结果。

  

  例如这样的一个函数,将返回值的类型定义为Promise<Buffer>,即表示该函数调用后返回的是一个异步结果为Buffer的Promise。

  以下是常见的调用Promise异步函数的方法:

  

  

  这样,无论是通过then还是await调用,都能严格检测到异步的返回结果(yield是一个例外,后面会提到)

  Callback/Promise自动识别函数

  这种函数形如:

  

  这种函数的callback参数是可选的,如果传入callback,那么就通过回调的方式处理异步结果。如果不传入回调,那么就会返回一个Promise。

  常见的两种调用方式:

  

  

  泛型异步返回值

  在没有typescript前,有很多的异步调用会更具不同的调用方式返回不同类型的结果。我们要兼容此部分代码,可以利用重载。但更好用一点的办法则是利用泛型来处理。

  例如有这样的一个异步函数:

  

  用于异步克隆对象。异步的返回类型要和调用时传入的类型相同。这里通过将参数originObj的类型限定为泛型TRst,将异步返回值的结果也限定为TRst来达到这样的目的。这个函数调用时,也不需要自动为函数加上类型,编译器会自动识别originObj的类型并将异步返回结果的类型设置为同样的类型。

  

  yield与generator

  目前在typescript下,在generator中使用yield,是难以得到异步返回类型的。

  编译器会默认yield等待的结果类型是个any,因此建议使用async await替代,虽然最终编译结果相差不大。从yield切换到await有一些需要注意的地方,例如await不能直接等待Promise数组。

时间: 2024-10-28 11:51:18

TypeScript 异步代码类型技巧的相关文章

14条最佳JS代码编写技巧

http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的,下面是来自Javascript Toolbox发布的14条最佳JS代码编写技巧,Sofish翻译(1,2). 1. 总是使用 ‘var’ 在javascript中,变量不是全局范围的就是函数范围的,使用”var”关键词将是保持变量简洁明了的关键.当声明一个或者是全局或者是函数级(function-

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

TypeScript Type Innference(类型推断)

在这一节,我们将介绍TypeScript中的类型推断.我们将会讨论类型推断需要在何处用到以及如何推断. 基础 在TypeScript中,在几个没有明确指定类型注释的地方将会使用类型推断来提供类型信息. var x = 3; 变量"x"的值被推断为number.这种推断发生在变量或者成员初始化.设置参数默认值.决定函数返回类型的时候. 最佳公共类型 当需要从多个表达式中进行类型推断的时候,这些表达式的类型将会用来推断出一个"最佳公共类型".例如: var x = [0

jQuery代码开发技巧收集,jquery常用的开发代码

jQuery代码开发技巧收集,jquery常用的开发代码 今天分享一个jquery常用的开发代码,大部分是网友总结的,总共60条.后期我也会陆续完善! 把我在开发中常用的写在这里,希望持续关注~~ 1. 使用siblings()来处理同类元素 // Rather than doing this $('#nav li').click(function(){ $('#nav li').removeClass('active'); $(this).addClass('active'); }); //

HTML 代码常用技巧

IE Javascript快捷键操作 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncontextmenu=return(false)><td>no</table> 可用于Table 2. <body onselectstart="return false"> 取消选取.防止复制 3. onpaste="

程序代码阅读技巧

一.代码阅读的必要性 阅读别人的代码作为研发人员是一件经常要做的事情.一个是学习新的编程语言的时候通过阅读别人的代码是个最佳的学习方法,另外是积累编程经验.如果你有机 会阅读一些操作系统的代码会帮助你理解一些基本的原理.更有就是在你作为一个质量确保人员或一个小领导的时候如果你要做白盒测试的时候没有阅读代码的能力 是不能完成相应的任务.最后一个就是如果你中途接手一个项目的时候或给一个项目做售后服务的时候是要有阅读代码的能力的. 二.收集所有可能收集的材料 阅读代码要做的第一件事情是收集所有和项目相

优化:更优雅的异步代码?

异步问题 回调地狱 异步编程中最常见的一种问题便是回调地狱. 单次ajax请求有多个回调响应 $.ajax({ type: 'get', url: '/path/to/calldata', success: function (response) { // todo sucCallback2(response); sucCallback3(response); } }) 我们产生多个success状态下的回调函数,或者多个ajax请求同时发送,全部success状态后执行回调. 如果需要在suc

async in c#5 第八章之哪个线程运行我的异步代码

第8章 哪个线程运行我的代码 看到社区里的朋友没有翻译完这本书,我接着对一下的章节进行翻译 像我之前说的,异步编程就是关于线程的.那就意味着我们需要理解在C#程序中哪个.NET线程什么时候运行我们的代码,并且当长时间运行的操作发生时线程会发生什么. 在await之前 你写的每一个异步方法中的一些代码将会在await关键字之前.同样,表达式中的一些代码也是等待状态. 这条代码总是运行在调用线程中.在await之前不会发生有意思的事情. 这是关于异步最常见的误解之一.异步从来不会把你的代码放到后台线

【WP8】同步执行异步代码

微软的StorageFile只支持异步的方式进行文件操作,我之前也封装过一个StorageHelper,但是当所有的方法都是异步的时候也带来一些问题 1.比如我们不能在构造函数调用异步代码(等待), 2.比如我们在离开App的时候我们需要对数据进行快速的保存(在事件中),这个时候就不适合用异步了,异步可能会导致保存失败,因为App已经不在前台了 最近就遇到了一个这样的需求 我封装了一个SqliteHelper类,提供了一些数据库操作的一些常用方法,在数据库使用之前,需要保证数据库路径的文件夹是存