当前位置: 首页 > news >正文

类型签名在Javascript中的探索

为什么80%的码农都做不了架构师?>>>   hot3.png

简介

类型签名轻轻诉说着函数最不可告人的秘密。短短一行,就能暴露函数的行为和目的。O(∩_∩)O~

作用

虽然js是动态类型的语言,但并不意味否定类型的存在,我们在写代码的时候还是要和Number,Boolean,String,Array等打交道,只不过没有在语言层面做类型检查。

  • 简洁美观(对于我来说这一点就足够了)
  • 降低阅读代码成本
  • 有效节约沟通成本(附带装X技能) 以下是描述同一个函数的
    • A:fs.readFile 函数有三个参数 第一个是字符串的文件路径,第二个是编码,第三个是回掉函数 回掉函数内部第一个代表错误,第二个代表文件内容(字符串) 无返回值
    • B:fs.readFile :: String:路径 -> String:编码 -> (Error -> String) -> ()
    • C:fs.readFile :: String -> String -> (Error -> String) -> ()
  • 编译期间检查错误(js未实现)
  • 生成文档

简单的例子

// Number -> Number -> Number
function add(a,b){
  return a + b;
}

add 上方的一行注释描述了函数从入参到返回值的过程,即 add 函数接受两个数字返回数字

  • Number代表数字类型
  • 最后一个Number 代表函数返回值的类型 前面两个Number分别代表函数的第一参数和第二个参数

数组 函数

js中有两个常用的类型,数组和函数,数组的类型可以写成Array,函数的类型可以写成Function。但这样的话我们从类型签名上获得的信息就很有限了,比如数组里面是什么?函数需要几个参?返回值是什么?

数组的类型可以写成 [String] 代表数组内部是String的类型

ps:其实数组可以看做容器 容器里面是什么还是要写上的,Promise也可以看做容器 比如类型可以写成 Promsie String

// [String] -> [Number]
// 求出每一项字符串的长度
function everyLength(xs){
  var r = [];
  for (var i = 0; i < xs.length; i++) {
    r.push(xs[i].length);
  }
  return r;
}

// [a] -> Number
function length(xs){
  return xs.length;
}
  • 所有的类型都是以大写开头,小写的 a 是类型变量 默认是代表任意类型(可以加约束)
  • everyLength 函数 输入一个字符串数组返回一个数字数组
  • length 输入一个数组返回一个数字

函数可以写成 (String -> String) 即在原有的基础上加上一个括号 代表一个函数

// (a -> b) -> [a] -> [b]
function map(fn,xs){
  var rs = [];
  for(var i = 0;i < xs.length;i++){
    rs.push(fn(xs[i]));
  }
  return rs;
}
  • ab 是两个类型变量
  • map 函数: 第一个参数是一个函数(该函数接收一个类型 a 返回一个类型 b) 第二个参数数组 数组内部的类型是 a(和前面函数 a 是相同的类型),返回值是数组其内部类型是 b (和前面函数的返回值保持一致)
  • 通过类型签名是不是可以获取到很多有效的信息 ^_^

可选参数的函数

我是不建议写带有可选参数,默认参数的函数的,这样会使函数产生多语意。更好的解决办法是写多个函数。如下,多选参数的函数就要写多个类型签名了

// String -> Buffer
// String -> String -> String
function readFile(url,encoding){
  if(encoding){
    return fs.readFileSync(url,encoding);
  }else{
    return fs.readFileSync(url);
  }
}

该函数可以通过两种方式去调用

  1. Url 返回 Buffer
  2. URLencoding 返回 String

json 配置 和 无参 无返回值

有很多时候我们写的json是没有具体类型的,可以通过{必要的key:类型} 来进行描述 如下:

//{url:String,fn:(String->())} -> ()
function req(config){
  // xx ....
  fn(result);
}
  • () 表示无返回值

对象方法

javascript 中的函数是可以使用this的 这种函数叫方法

//Element ~> String -> ()
function setText(text){
  var div = $(this);
  div.text(text);
}
$("[text-w]").each(setText);

function Persion(){
  // xx ....
}

// Persion ~> () -> String
Persion.prototype.getName(){
  return this.name;
}
  • this 类型写在最前面 由于 this 不是一个参数 所以用 ~> 代替 -> 其它的保持不变

总结

以下是对类型的描述总结

  • Number 数字
  • String 字符串
  • [a] 数组
  • (a -> b -> c) 函数
  • () 无返回值 或者 无参数
  • Promise
  • {} json
  • this x ~> x

转载于:https://my.oschina.net/diqye/blog/814522

相关文章:

  • 快速入门,理解,使用 axios请求
  • 第二章 存储,2.1 永不停止的脚步——数据库优化之路(作者:佳毅)
  • CSS实现元素水平垂直居中的几种方式
  • 年末购机推荐,首选OPPO这两款中端旗舰王者
  • js中深浅拷贝的实现方式(含图解原理)
  • Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器...
  • 查看httpd状态
  • js中如何判断引用值为数组(几种不同方式的详解)
  • 项目代码重用
  • js中数组去重的几种实现方式(区别)
  • java创建文件和目录
  • JS For循环中嵌套setTimeout()方法的理解
  • ubuntu下zabbix服务器监控工具部署
  • 前端性能优化-图片
  • MapString, String循环遍历的方法
  • ----------
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • Angular Elements 及其运作原理
  • AngularJS指令开发(1)——参数详解
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Redis 中的布隆过滤器
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 订阅Forge Viewer所有的事件
  • 构建工具 - 收藏集 - 掘金
  • 如何设计一个比特币钱包服务
  • 写给高年级小学生看的《Bash 指南》
  • ​ArcGIS Pro 如何批量删除字段
  • (1)(1.9) MSP (version 4.2)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (javascript)再说document.body.scrollTop的使用问题
  • (poj1.2.1)1970(筛选法模拟)
  • (二)WCF的Binding模型
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (五)网络优化与超参数选择--九五小庞
  • (已解决)什么是vue导航守卫
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)虚函数剖析
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .Net Core和.Net Standard直观理解
  • .NET 发展历程
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net的DataSet直接与SQL2005交互
  • .net中的Queue和Stack
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [20190416]完善shared latch测试脚本2.txt
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [Bada开发]初步入口函数介绍
  • [BZOJ3757] 苹果树
  • [GXYCTF2019]禁止套娃