1、数组的类型
在 TypeScript 中,数组类型有多种定义方式,比较灵活。
「类型 + 方括号」表示法
let fibonacci : number[] = [1,2,3,4,5,6]
数组的项中不允许出现其他的类型。
数组泛型
我们也可以使用数组泛型(Array Generic) Array<elemType> 来表示数组:
let fibonacci: Array<number> = [1,2,3,4,5]
用接口表示数组
接口也可以用来描述数组:
interface NumberArray {
[index:number]:number;
}
let fibonacci : NumberArray = [1,2,3,4]
NumberArray 表示:只要索引的类型是数字时,那么值的类型必须是数字。
虽然接口也可以用来描述数组,但是我们一般不会这么做,因为这种方式比前两种方式复杂多了。
不过有一种情况例外,那就是它常用来表示类数组。
any 在数组中的应用
一个比较常见的做法是,用 any 表示数组中允许出现任意类型:
let list: any[] = [
'xcatliu',
25,
{ website: 'http://xcatliu.com' }
];
2、函数的类型
函数声明
在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression):
// 函数声明
function sum (x,y){
return x + y
}
//函数表达式
let mySum = function (x,y){
return x + y
}
一个函数有输入和输出,要在 TypeScript 中对其进行约束,需要把输入和输出都考虑到,其中函数声明的类型定义较简单:
function sum(x: number, y: number): number {
return x + y;
}
函数表达式
如果要我们现在写一个对函数表达式(Function Expression)的定义,可能会写成这样:
let mySum = function (x:number,y:number) : number {
return x + y ;
}
这是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的 mySum,是通过赋值操作进行类型推论而推断出来的。如果需要我们手动给 mySum 添加类型,则应该是这样:
let mySum : (x:number,y:number) => number = function(x:number,y:number):number{
return x + y;
}
在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。
用接口定义函数的形状
我们也可以使用接口的方式来定义一个函数需要符合的形状:
interface SearchFunc {
(source:string,subString:string):boolean;
}
let mySearch : SearchFunc;
mySearch = function (source:string,subString:string){
return source.search(subString) !== -1
}
采用函数表达式|接口定义函数的方式时,对等号左侧进行类型限制,可以保证以后对函数名赋值时保证参数个数、参数类型、返回值类型不变。
可选参数
前面提到,输入多余的(或者少于要求的)参数,是不允许的。那么如何定义可选的参数呢?
与接口中的可选属性类似,我们用 ? 表示可选的参数:
function buildName(first:string,lastName?:string){
if(lastName){
return firstName + ' '+ lastName;
}else{
return firstName;
}
}
let tomcat = buildName ('tom','cat')
let tom = buildName('tom')
需要注意的是,可选参数必须接在必需参数后面。换句话说,可选参数后面不允许再出现必需参数了:
参数默认值
在 ES6 中,我们允许给函数的参数添加默认值,TypeScript 会将添加了默认值的参数识别为可选参数:
function buildName(first:string,lastName:string = 'cat'){
if(lastName){
return firstName + ' '+ lastName;
}else{
return firstName;
}
}
let tomcat = buildName ('tom','cat')
let tom = buildName('tom')