好久没有接触过小程序开发,上一次项目级的开发还是基于原生js。当前大环境下typescript已经深入到前端开发的各个角落,我们熟悉的三大框架也逐渐直接使用ts,或者可以通过架构配置已经能很好的兼容typescript。那么ts在小程序中的体验如何呢,带着这个疑惑demo搞起。

闲谈ts的优缺点:

    作为对比,在说ts之前,我们应该先想到js的一些主要特征:js是一种解释性语言、基于面向对象的脚本语言、弱类型、跨平台、安全性。个人的理解是ts的出现主要是弥补js语言弱类型带来的一些问题。这并不是说弱类型是个缺点,对于很多喜欢js开发的人员来说,弱类型使得代码开发更加的灵活。但是弱类型也会带来一些问题,js变量数据类型的动态性,只有执行的时候才会确认变量的类型,因此一定程度上降低了开发效率。同时ts中的类型机制,能根据开发者个人需要控制类型,ts能在代码编译前就提示类型使用等错误,减少类型使用错误或者减少类型判断处理等问题。

    因此总结一下:

    优点:增强代码的可读性和可维护性,类型系统使得代码在编码和编译的时候就能发现大部分的错误;是js的超集,js文件可以直接改后缀变成ts文件,具有良好的包容性;ts中引入了模块概念;

    缺点:类型维护增加开发的复杂度;对一些外部库的兼容问题;


ts小程序问题,包括但不限于ts问题:

问题1:创建page页面的时候,.ts文件需要手动创建,编译的时候会自动地编译成对应的js。

问题2:wx.request 不支持对jonp请求的处理,需对返回的字符串特殊处理。

问题3:App({})等对象或方法中的 如IAppOption等内置接口的定义,可能会影响属性的添加修改等操作,可进入对应的文件进行修改。如要求不是很严格也可将IAppOption接口直接换成类型any。

问题4:引用外部ui框架,以Vant Weapp 为例(前身zanui)引入方式可以下载后引入,也可npm在线安装引入,我们以npm安装为例:

在项目的根目录miniprogram 下打开命令窗口 

npm i @vant/weapp -S --production

安装完成后,小程序开发者工具菜单栏:工具->构建npm, 构建完成后miniprogram 下生成了miniprogram_npm文件夹,里面就是对应的package文件;页面引用button组件为例:

{  "usingComponents": {     "van-button": "@vant/weapp/button/index"  }}
<van-button type="primary">按钮van-button>

问题5:封装promise的时候报错提示

miniprogram/utils/requestapi.ts:34:21 - error TS2585: 'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the `lib` compiler option to es2015 or later.

解决方法:在tsconfig.json的compilerOptions中的lib加入"es2015.promise"。

typescript 怎么获取类型 typescript set get_json

问题6:api接口请求封装

function post(url:any, params:any) {    return requestApi(url, params, 'POST')}function get(url:any, params:any) {    return requestApi(url, params, 'GET')}/** * 请求API * @param  {String}   url         接口地址 * @param  {Object}   params      请求的参数 * @param  {String}   method      请求类型 */function requestApi(url:string, params:any, method:any) {    if (method == 'POST') {        var contentType = 'application/x-www-form-urlencoded'    } else {        var contentType = 'application/json'    };    let back =  new Promise(function(resolve:any, reject:any){          wx.request({          url:url,          method : method,          data: params,          header: {'Content-Type': contentType},          success: function (res:any) {              resolve(res)          },          fail: function (res:any) {              reject(res)          },          success: function (res:any) {              resolve(res)          }      })    });    return back}module.exports = {  post, get }

问题7:小程序中引入echart的小程序版本ec-canvas

由于小程序封闭的生态,标签元素和h5元素标签的差异,所以常见的画图库并不支持小程序,因此除了自己画图之外可以看ec-canvas,引入使用不赘述。

问题8:待补充