从C#到TypeScript - function
总目录
从C#到TypeScript - function
虽然TypeScript里有了类,但JavaScript的function也还在,这也是和C#的不同所在。
C#里函数不能脱离类工作,但TypeScript的function和JavaScript一样,可以单独工作。
函数类型
函数和C#一样可以有名字,也可以是匿名函数,匿名函数有两种写法:
function checkLogin(name: string, pwd: string): boolean{
return true;
}
let checkLogin = (name: string, pwd: string) => {
return false;
}
let checkLogin = function(name: string, pwd: string){
return true;
}
前面文章写变量声明时有写变量类型let str: string,但上面其实都没有把函数的类型真正写出来,比如最后一个let checkLogin里并没有标明返回的类型。
如果要把函数做为参数或返回值的话如果没有明确类型的话使用会很不方便,没有智能提示,重构也不方便。
函数的返回类型其实就是由参数+返回类型构成,下面代码的(name: string, pwd: string) => boolean就是checkLogin的返回类型。
let checkLogin: (name: string, pwd: string) => boolean = function(name: string, pwd: string){
return true;
}
返回类型里的参数名不需要与真正的参数名一致,只需要类型一致即可。
当然,大部分情况下是不用写这么复杂的返回类型的,前面文章有说过类型推论,TypeScript会根据上下文推论出返回值的类型。
函数参数
TypeScript的参数和JavaScript的参数不太一样,调用JavaScript函数的参数可以多或少都可以,但TypeScript里函数需要确保传入参数的个数和定义的一致。
同C#里的函数参数可以有默认值一样,TypeScript也支持,并且还支持可空参数。
默认值只需要在参数后面写上=某值就可以,默认值参数可以在任意位置,不过在必须参数前面时,想用默认值的话需要传undefined。
可空参数和前面说的可空属性一样,参数名后加?号,可空参数必须是在最后面。
function checkLogin(name: string, pwd: string, isAdmin: boolean = false, email?: string){
console.info(isAdmin);
}
checkLogin('brook'); // 编译不了
checkLogin('brook', '123456'); // false
checkLogin('brook', '123456', undefined); // false
checkLogin('brook', '123456', false); // false
checkLogin('brook', '123456', true, 'brook@email.com'); // true
剩余参数
JavaScript里的参数本身是个数组,可以是任意个数且都可以在函数体内用arguments来访问。
TypeScript同样可以通过剩余参数来支持,形式上类似于C#的param。
剩余参数的格式是...restParam: string[]。
function checkLogin(name: string, pwd: string, ...others: string[]){
console.info(others.join(' '));
}
checkLogin('brook', '123456', 'brook@email.com', `12800`); // brook@email.com 12800
this
this在JavaScript里总是指向调用者,这点经常容易导致被坑,在ES6之前经常需要类似var self = this来把this保存下来。
ES6和TypeScript针对这点做了改进,使用箭头函数可以把创建函数时的this自动保存下来。
let permission = {
name: 'brook',
checkLogin: function() {
return function() {
console.info(this.name === 'brook');
}
}
};
permission.checkLogin()(); // 出错, this为undefined
let permission = {
name: 'brook',
checkLogin: function() {
return () => {
console.info(this.name === 'brook');
}
}
};
permission.checkLogin()(); // 通过,因为用了箭头函数
不过上面的this还是有个缺点,得到的this是any类型,这样重构起来会不方便,这时可以用this参数来改进:
this参数只是一种定义,使用时是不需要传的。
interface Permission{
name: string;
checkLogin(this: Permission): ()=>void;
}
let permission: Permission = {
name: 'brook',
checkLogin: function(this: Permission) {
return () => {
console.info(this.name === 'brook'); //这里的this不是any,而是Permission
}
}
};
permission.checkLogin()();
这样也倒逼着定义好类型,发挥TypeScript强类型的优势。
泛型函数
同C#一样支持泛型函数,写法也差不多。
function deserialize<T>(content: string): T { }
function addItem<TKey, TValue>(key: TKey, value: TValue) { }
也支持泛型约束,C#用的是where T: object,而TypeScript用的是extends Object。
function deserialize<T extends Object>(content: string): T { }
泛型函数类型比普通函数类型在前面多了个<T>,比如上面deserialize。
let deserialize: <T>(content: string) => T;
但这样如果做为参数就略显复杂,可以用接口重构下:
function deserialize<T extends Object>(content: string): T { }
interface serializable<T> {
(content: string): T;
}
function parse<T>(s: serializable<T>){ }
parse(deserialize);
从C#到TypeScript - function的更多相关文章
- TypeScript Function(函数)
在JavaScript中,函数是构成任何应用程序的基础块.通过函数,你得以实现建立抽象层.模仿类.信息隐藏和模块化.在TypeScript中,虽然已经存在类和模块化,但是函数依旧在如何去"处 ...
- [TypeScript] Function Overloads in Typescript
It's common in Javascript for functions to accept different argument types and to also return differ ...
- [Typescript] Function defination
Define a function type and params type: // The function init // Accept two params which are both typ ...
- TypeScript之接口类型
Interfaces 作为TypeScript中的核心特色之一,能够让类型检查帮助我们知道一个对象应该有什么,相比我们在编写JavaScript的时候经常遇到函数需要传递参数,可能在编写的时候知道这个 ...
- TypeScript之基本数据类型
前言 最近项目很急,所以没有什么时间回答关于Xamarin.Android方面的问题,也有一段时间没有更新.主要是手头很缺人,如果有谁有兴趣加入我们的话,可以私聊我,这样我就能继续造福社区了,同时还有 ...
- 基本数据类型TypeScript
TypeScript 前言 最近项目很急,所以没有什么时间回答关于Xamarin.Android方面的问题,也有一段时间没有更新.主要是手头很缺人,如果有谁有兴趣加入我们的话,可以私聊我,这样我就能继 ...
- C# vs TypeScript - 高级类型
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- 从C#到TypeScript - 变量
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- 从C#到TypeScript - 接口
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
随机推荐
- PHP的Cookie、Session和跟Laravel相关的几点了解
这两天通过对Cookie和Session的查找和了解,网上关于它们两个的基础知识点都是差不多的,也收藏了几篇不错的博客,同时自己做了些实验后,有了以下几点了解: 1.setcookie 这里有三个地方 ...
- 基于MDK编程STM32程序无法使用,硬件仿真在汇编窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //进入调试模式”
为方便工作上做测试,移植FreeRTOS到STM32F103xx,先做简单的UART1 printf. 工程编译通过,运行逻辑也确认可行,可就是无法正常打印消息.对比了网上的移植工程也是一致,硬件仿真 ...
- 关于Java通过JNI调用C 动态链接库(DLL)
JNI介绍 用JNI实现Java和C语言的数据传递 JNI原理分析和详细步骤截图说明 jni的JNIEnv指针和jobject指针 JNI实现回调| JNI调用JAVA函数|参数和返回值的格式 Jni ...
- Java Web EL JSTL的用法
1.导入包 fastjson-1.2.2.jar 2.JSP文件加入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" p ...
- TLD视觉跟踪算法(转)
源:TLD视觉跟踪算法 TLD算法好牛逼一个,这里有个视频,是作者展示算法的效果,http://www.56.com/u83/v_NTk3Mzc1NTI.html.下面这个csdn博客里有人做的相关总 ...
- Jquey里的同步请求和异步请求
1.同步请求 发送了同步请求后 会一直等待 先执行 alert("result:" + d); temp = d; 在执行alert("this is last:& ...
- IOS开发根据字体大小等获取文字所占的高度
Model *model = self.modelArr[indexPath.row]; //根据label文字获取CGRect NSMutableParagraphStyle *paragraphS ...
- 无锁同步-JAVA之Volatile、Atomic和CAS
1.概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步. 关于JAVA中的原子操作,我们很容易想到的是Volatile变量.java.util.concurren ...
- 关于Inflater
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- java系列--HTTP协议
一.HTTP请求信息 请求行 请求头 空行 消息体 1.防盗链: 枚举类型: 二.中文乱码问题 1.Get提交 String username = request.getParameter(" ...