TypeScript教程3
1、快速回顾一下这JavaScript中的命名函数和匿名函数:
|
1
2
3
4
5
|
//Named functionfunction add(x, y) { return x+y;}//Anonymous functionvar myAdd = function(x, y) { return x+y; }; |
2、TS简单函数例子
|
1
2
3
4
5
|
function add(x: number, y: number): number { return x+y;}var myAdd = function(x: number, y: number): number { return x+y; }; |
我们可以自定义每个参数和返回类型。
3、编写匿名函数一个函数的类型有相同的两个部分:参数和返回类型的类型。 这个名字只是帮助可读性。可以不一样,只要函数类型统一即可。
|
1
2
|
var myAdd: (baseValue:number, increment:number)=>number = function(x: number, y: number): number { return x+y; }; |
我们明确的返回类型使用(= >)表示。
4、根据上下文判断返回类型
通过返回数据判断返回类型
|
1
2
3
4
|
// myAdd has the full function typevar myAdd = function(x: number, y: number): number { return x+y; };// The parameters 'x' and 'y' have the type numbervar myAdd: (baseValue:number, increment:number)=>number = function(x, y) { return x+y; }; |
5、默认参数如下写法,必须传入指定的变量,否则报错。
|
1
2
3
4
5
|
function buildName(firstName: string, lastName: string) { return firstName + " " + lastName;}var result1 = buildName("Bob"); //error, too few parametersvar result2 = buildName("Bob", "Adams", "Sr."); //error, too many parametersvar result3 = buildName("Bob", "Adams"); //ah, just right |
我们在TS中使用?表示可选参数。 例如,我们希望最后一个参数是可选的:
|
1
2
3
4
5
6
7
8
|
function buildName(firstName: string, lastName?: string) { if (lastName) return firstName + " " + lastName; else return firstName;}var result1 = buildName("Bob"); //works correctly nowvar result2 = buildName("Bob", "Adams", "Sr."); //error, too many parametersvar result3 = buildName("Bob", "Adams"); //ah, just right |
可选参数必须遵循必需的参数。 如果我们想让名可选而不是姓,我们需要改变参数在函数的顺序,把名字列表中的最后一个。
在TS中,我们还可以设定一个值,一个可选参数如果用户不提供。 这些被称为缺省参数。 让我们前面的示例和默认的姓“Smith”。
|
1
2
3
4
5
|
function buildName(firstName: string, lastName = "Smith") { return firstName + " " + lastName;}var result1 = buildName("Bob"); //works correctly now, alsovar result2 = buildName("Bob", "Adams", "Sr."); //error, too many parametersvar result3 = buildName("Bob", "Adams"); //ah, just right |
如下为缺省参数,即包含默认值。
|
1
|
function buildName(firstName: string, lastName = "Smith") { |
6、rest参数
|
1
2
3
4
5
|
function buildName(firstName: string, ...restOfName: string[]) { return firstName + " " + restOfName.join(" ");}var employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie"); |
使用...代表一个变量集合。 7、Lambdas和使用“this”this在js中的使用是相当混乱的。通常要根据上下文来判断其含义。
让我们来看一个例子:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
var deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { return function() { var pickedCard = Math.floor(Math.random() * 52); var pickedSuit = Math.floor(pickedCard / 13); return {suit: this.suits[pickedSuit], card: pickedCard % 13}; } }}var cardPicker = deck.createCardPicker();var pickedCard = cardPicker();alert("card: " + pickedCard.card + " of " + pickedCard.suit); |
这时候会报错,因为this找不到suits,因为这个时候的this已经不是deck中的this了。
<1>为了解决这个问题,我们切换函数使用lambda表达式语法(()= > { })而不是JavaScript函数表达式。 这将自动捕获创建函数时可用的“this”:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
var deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { // Notice: the line below is now a lambda, allowing us to capture 'this' earlier return () => { var pickedCard = Math.floor(Math.random() * 52); var pickedSuit = Math.floor(pickedCard / 13); return {suit: this.suits[pickedSuit], card: pickedCard % 13}; } }}var cardPicker = deck.createCardPicker();var pickedCard = cardPicker();alert("card: " + pickedCard.card + " of " + pickedCard.suit); |
<2>使用bind方法[希望我没有理解错]
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
var deck = { suits: ["hearts", "spades", "clubs", "diamonds"], cards: Array(52), createCardPicker: function() { return function() { var pickedCard = Math.floor(Math.random() * 52); var pickedSuit = Math.floor(pickedCard / 13); return {suit: this.suits[pickedSuit], card: pickedCard % 13}; } }}var cardPicker = deck.createCardPicker().bind(deck);var pickedCard = cardPicker();alert("card: " + pickedCard.card + " of " + pickedCard.suit); |
更多信息方式,你可以阅读Yahuda卡茨 理解JavaScript函数调用和“this” 。
==================================================
TypeScript教程3的更多相关文章
- TypeScript教程2
在TS中,我们允许开发人员使用面向对象技术. 1.类让我们看看一个简单的基于类的例子: class Greeter { greeting: string; constructor(message: s ...
- TypeScript教程
汇智课堂 地址 http://www.hubwiz.com/course/55b724ab3ad79a1b05dcc26c/ TypeScript是一种由微软开发的自由和开源的编程语言.它是Java ...
- TypeScript 教程&手册
参考:https://www.w3cschool.cn/typescript/ https://www.gitbook.com/book/zhongsp/typescript-handbook/det ...
- TypeScript教程1
Boolean类型aser:和as3一样 var isDone: boolean = false; 复制代码 Number类型aser:as3经常用int和uint,以后只用number就可以啦 va ...
- 2018-05-09 5分钟入门CTS-尝鲜中文版TypeScript
知乎原链 本文为中文代码示例之5分钟入门TypeScript的CTS版本. CTS作者是@htwx(github). 它实现了关键词和标准库的所有命名汉化. 本文并未使用附带的vscode相关插件(包 ...
- HowToDoInJava 其它教程 1 · 翻译完成
原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 Maven 教程 如何在 ...
- 【electron+vue3+ts实战便笺exe】一、搭建框架配置
不要让自己的上限成为你的底线 前言 诈尸更新系列,为了跟上脚步,尝试了vue3,在学习vue3的时候顺便学习一手electron和ts,本教程将分别发布,源码会在最后的文章发布.因为还在开发中,目前也 ...
- 100 个常见错误「GitHub 热点速览 v.22.35」
本周的特推非常得延续上周的特点--会玩,向别人家的女朋友发送早安.这个错误是如何发生的呢?如何有效避免呢?自己用 daily_morning 免部署.定制一个早安小助手给女友吧. 除了生活中的错误,工 ...
- 转载:TypeScript 简介与《TypeScript 中文入门教程》
简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...
随机推荐
- [iOS]C语言技术视频-01-变量的定义
下载地址: 链接: http://pan.baidu.com/s/1eQJaVwY 密码: c7j8
- 一个UWSGI的例子
摘要:uwsgi执行顺序:启动master进程,执行python脚本的公共代码(import同一层).然后生成worker进程,uwsgi.post_fork_hook=init_functions, ...
- mysql 插入数据后返回当前的自增ID方法
存储过程的写法: mysql>create procedure test( ->in username varchar(50), ->in password varchar(50), ...
- PHP学习笔记-1——快捷键
整行删除 ctrl+E set get 生成 alt+ insert 查找.搜索和替换 Ctrl-F3 搜索位于插入点的词 F3/Shift-F3 在文件中查找下一个/上一个 Ctrl-F/H 在文件 ...
- laravel无法显示路由界面
安装完laravel项目后,开启了重写,/app/storage也设置好了权限,但是始终无法显示出页面,并出现: "Whoops, looks like something went wro ...
- JNI介绍(转)
源:JNI介绍 JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的An ...
- AFNetworking content type not support
ref:http://blog.csdn.net/nyh1006/article/details/25068255 1.错误信息:Error:Error Domain=AFNetworkingErro ...
- javascript-函数及兼容
1.事件绑定,删除,传播,默认方式,获取类型的兼容 var eventList = { //添加事件兼容 addEvent:function (event,type,backevent) { if ( ...
- Unity3D ——强大的跨平台3D游戏开发工具(二)
第二章 Unity3D的简单预览 每个Unity3D版本都会自带一个Demo源文件.在3.0的正式版中,自带的Demo就是网上展示的那款强大的射击游戏.在一般情况下,您只要第一次 打开Unity3D ...
- 饼干是这样压缩的——PHP使用zlib扩展实现页面GZIP压缩输出
饼干是这样压缩的——PHP使用zlib扩展实现页面GZIP压缩输出 GZIP(GNU-ZIP)是一种压缩技术.经过GZIP压缩后页面大小可以变为原来的30%甚至更小.这样用户浏览的时候就会感觉很爽很愉 ...