一、类型注解

1.1 类型注解

函数的类型注解分为两个部分:参数类型注解和返回值类型注解。其中返回值类型注解有时候我们可以直接省略,因为Typescript可以根据返回的语句来自动判断出返回值的类型。

function add (x: number, y: number): number {
return x + y;
} // 匿名函数完整的参数注解;
let myAdd: (x: number, y: number) => number = function(x: number, y: number): number { return x + y; }; // 匿名函数表达式完整的参数注解;
/*这其中,表达式左右的类型注解中,参数名称可以不一致,我们需要把顺序对应上即可。当函数没有返回值的时候,我们用void类型进行注解。*/

当我们指定了赋值语句一侧的类型之后,我们是可以忽略另一侧的类型注解,在Typescript的类型推论中,被称作“按上下文归类”。

let myAdd = function(x: number, y: number): number {
return x + y;
}; //省略左侧的类型注解
let myAdd: (baseValue: number, increment: number) => number = function(x, y) { return x + y; };
// 省略右侧的类型注解,并且左右侧的参数名称并不相同。

除了基本的类型注解之外,我们还有其他的方式来描述这两部分类型。

例如使用变量来单独定义参数:

let param: { a: number };
function foo(param) {}

还可以利用接口的形式定义参数:

interface Param {
a: number;
}
function foo (param: Param): number {
return 1;
}

同时我们也可用这些方法去定义返回值的类型。

除此之外,我们还可以利用接口直接定义函数:

interface SearchFunc {
(a: number, b: number): number;
}
let search : SearchFunc;
search = function(a: number, b: number) {
return a+b;
}

1.2 可选参数和默认参数

在Typescript中定义函数是,定义了参数的个数及类型。当调用该函数时,必须严格遵守其个数和参数类型。但是在Javascript中,我们可以选择性传递参数,当某个参数不传值的时候,该参数的值为undefined。在TS中,我们可以使用?来表示该参数为可选参数。

let myAdd = function (a: number, b?: number) { //b为可选参数
if (b === undefined) {
return a;
}
return a + b;
}

除了使用可选参数之外,我们还可以给参数设置默认值:

let myAdd = function (a: number, b = 0) { //b不传值时,该值为0
return a + b
}

1.3 剩余参数

当传入的参数不确定数量时,可以使用…来表示剩余参数,进行传值。这与ES6中的用法是一致的。

function plus(firstNum: number, ...restofNum: number[]) {
return firstNum + restofNum.reduce((a, b) => a + b);
} // 我们用一个数字类型的数组来规定剩余参数的类型。
let a = plus(1, 2, 3, 4);
console.log(a); //10

二、函数重载

我们在JS中定义的函数,可以接受任意的参数,这里的任意有两层意义:一个是任意个数,一个是任意类型(JS中没有类型检查机制)。因此我们在构建一个健壮性足够强的函数时,通常会用if语句或switch语句在其中进行类型或个数的判断,来执行不同的逻辑。这在代码的意义上,也算是一种重载。但是其最大的问题在于,重载的逻辑是耦合在一起的,没有做到逻辑分离。然而TS的重载,实际上也没有很好的解决这个问题。

我们在声明重载的时候需要注意以下几点:

  • 重载函数只有函数声明,没有函数体。其本质是记录你调用函数的方式。
  • 函数实现必须紧跟函数重载声明。
  • 重载函数必须和其实现的参数个数保持一致,不能出现函数实现中不能满足的重载声明。
function padding(all: number); // 当传入一个值的情况;
function padding(topAndBottom: number, leftAndRight: number) : {
top: string;
right: string;
bottom: string;
left: string;
}; //传入两个值的情况
function padding(top: number, right: number, bottom: number, left: number) : {
top: number;
right: number;
bottom: number;
left: number;
}; //传入四个值的情况
function padding(a: number, b?: number, c?:number, d?:number) {
if (b === undefined && c === undefined && d === undefined) {
b = c = d = a;
} else if (c === undefined && d === undefined) {
c = a;
d = b;
}
return {
top: a,
right: b,
bottom: c,
left: d,
};
}
/*函数实现体内,通过if来处理不同参数情况的逻辑*/

Function(函数分享)第二节的更多相关文章

  1. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  2. 学习Vue第二节,v-cloak,v-text,v-html,v-bind,v-on使用

    v-cloak,v-text,v-html,v-bind,v-on使用 <!DOCTYPE html> <html> <head> <meta charset ...

  3. 深入理解javascript函数系列第二篇——函数参数

    × 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...

  4. seajs第二节,seajs各模块依赖关系

    index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  5. 源码讲解 node+mongodb 建站攻略(一期)第二节

    源码讲解 node+mongodb 建站攻略(一期)第二节 上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb. 代码http://www.imlwj.com/download/n ...

  6. 第二节:Web前端-ASP.NET之C#基础

    第二节:Web前端-ASP.NET之C#基础 学习ASP.NET,要掌握学习语言,控件等技能, <div style="text-align: center; line-height: ...

  7. 【精编重制版】JavaWeb 入门级项目实战 -- 文章发布系统 (第二节)

    说明 本教程是,原文章发布系统教程的精编重制版,会包含每一节的源码,以及修正之前的一些错误.因为之前的教程只做到了评论模块,很多地方还不完美,因此重制版会修复之前的一些谬误和阐述不清的地方,而且,后期 ...

  8. Ionic 入门与实战之第二章第二节:Ionic 环境搭建之 Ionic Lab 使用

    原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第二章第二节,主要对 Ionic Lab 工具作了介绍,并讲解了其使用方法,这也是一个开发 Ionic 比较好的调试工具. 原文发表于 ...

  9. 【转】JavaScript里Function函数实现可变参数

    转载:  http://www.oschina.net/question/54100_15938 使用javascript类库函数时,经常会遇到一个函数,可以使用不同个数的参数的情况 比如:exp(v ...

  10. 第二节 PHPUnit测试的剖析

    现在,让我们仔细看看测试结构的样子. 让我们从一个简单的测试用例开始,它将显示基本的PHPUnit测试结构. 以下代码片段是测试用于排序数组的两个PHP函数的一个非常基本的示例:asort()用于对数 ...

随机推荐

  1. C语言-入门级编程语言--编程小白首选

    我们都知道计算机很厉害,利用计算机可以高效地处理和加工信息,随着计算机技术的发展,计算机的功能越来越强大,不但能够处理数值信息,而且还能处理各种文字.图形.图像.动画.声音等非数值信息.   在199 ...

  2. Go语言中Goroutine与线程的区别

    1.什么是Goroutine? Goroutine是建立在线程之上的轻量级的抽象.它允许我们以非常低的代价在同一个地址空间中并行地执行多个函数或者方法.相比于线程,它的创建和销毁的代价要小很多,并且它 ...

  3. 【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息

    问题描述 在使用Azure App Service时候,我们有时候对 一些请求发生错误毫无头绪,能从错误代码中知道请求错误,但是更多的信息呢? 当我们需要更多的信息时候,通常有以下的一些方式来查找问题 ...

  4. SQL 禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项

    注:本文摘自:http://blog.csdn.net/heshengfen123/article/details/3597125 在执行SQL脚本过程中如果出现 禁止在 .NET Framework ...

  5. springboot入门系列(五):SpringBoot连接多RabbitMQ源

    SpringBoot连接多RabbitMQ源 在实际开发中,很多场景需要异步处理,这时就需要用到RabbitMQ,而且随着场景的增多程序可能需要连接多个RabbitMQ.SpringBoot本身提供了 ...

  6. C++学习---队列的构建及操作

    一.循环队列 #include <iostream> using namespace std; #define MAXQSIZE 100 typedef struct { int* bas ...

  7. 有关hashMap跟hashTable的区别

    HashMap和Hashtable都实现了Map接口 HashMap是非synchronized,而Hashtable是synchronized HashTable使用Enumeration,Hash ...

  8. eclipse 开发常见问题集锦

    问题1: eclipse导入外部项目,中文显示乱码(如下图) 方案:项目名-->右键属性-->如下图: 问题2: jsp/html页面eclipse双击打开,代码在工作区不显示(如下图:) ...

  9. Stream(二)

    public class Test { /* * Stream接口: * 实现类 * IntStream * DoubleStream * LongStream * * 一.创建Stream * 1. ...

  10. 调度《Taint(污点) 和 Toleration(容忍)》

    节点亲和性(详见这里),是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点.Taint 则相反,它使 节点 能够 排斥 一类特定的 pod. Taint 和 tolerat ...