参数类型和函数类型
命名函数
function add(x:number, y:number):number {
return x + y;
}
匿名函数
var add = function(x:number, y:number):string {
return "Hello Ts";
}
指定参数具体意义的写法
var myTs:(name:string, age:number) => number = function (n:string, a:number):number {
return a
}
函数的可选和默认参数
正常的传递参数
function getName(firstName: string, lastName: string) {
return firstName + " " + lastName;
}
var res1 = getName('joh', 'wong'); // 此处正确
var res2 = getName('joh'); // 此处错误
var res3 = getName('joh', 'wong', 'whatever'); // 此处错误 超出限定范围
可选参数:含有?的参数
function getName(firstName?: string, lastName?: string) {
if(firstName && lastName) {
return firstName + " " + lastName;
}
if(firstName) {
return firstName;
}
if(lastName) {
return lastName;
}
return 'nothing here';
}
var res0 = getName(); // 没有参数
var res1 = getName('joh', 'wong'); // 此处正确
var res2 = getName('joh'); // 此处正确 含有问号的可以不传
var res3 = getName('joh', 'wong', 'whatever'); // 此处错误 超出限定范围
默认参数:
function getName(firstName:string, lastName='Wong') {
return firstName + ' ' + lastName;
}
var res1 = getName('Joh'); // 正确
var res2 = getName('Joh', 'Wong1'); // 正确, 此处覆盖默认值
var res3 = getName('Joh', 'Wong', 'Other'); // 错误, 无第三个参数
函数的可变参数
… 后面是数组的形式:
function pName(firstName:string, ...restOfname:string[]) {
return firstName + ' ' + restOfname.join(' ');
}
function pName2(...restOfname:string[]) {
return restOfname.join(' ');
}
var pn = peopleName('one', 'two', 'three', 'four', 'five'); // 正确
var pn2 = peopleName('one', 'two', 'three', 'four', 'five'); // 正确
函数中 Lambda 和 this 关键字
普通的闭包
var people = {
name: ['J', 'L', 'M'],
getName: function() {
var that = this;
console.log(that); // 此处指向的是people对象
return function() {
var i = Math.floor(Math.random() * 3);
console.log(this); // 此处指向的是 window
return {
n: that.name[i]
}
}
}
}
var myName = people.getName();
console.log(myName().n);
Lambda的形式
var people = {
name: ['J', 'L', 'M'],
getName: function() {
// Lambda形式的闭包
return () => {
var i = Math.floor(Math.random() * 3);
console.log(this); // 此处指向的是 window
return {
n: that.name[i]
}
}
}
}
var myName = people.getName();
console.log(myName().n);
函数重载
function attr(name:string):string; // 声明一个方法重载的定义,不实现方法体{}
function attr(age:number):number; // 声明一个方法重载的定义,不实现方法体{}
// 声明一个方法重载的定义,并实现方法体{}
function attr(param:any):any {
if(param && typeof param === 'string') {
console.log('name');
} else if (param && typeof param === 'number') {
console.log('age');
} else {
console.log('other');
}
}
attr('Joh'); // name
attr(10) // age
attr(true) // other