1.类型推论
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
上述代码虽然没有指定类型,但是会在编译的时候报错
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成any类型而不被类型所检查到
2.联合类型
表示取值可以为多种类型中的一种。
let my: string|number
联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型
3.对象的类型--接口
接口:是对行为的抽象,具体如何行动需要由类(class)去实现(implement)
TypeScript中的接口是一个非常灵活的概念,除了可以用于对类的一部分进行抽象意外,常用于对对象的形状进行描述
例子:
interface Person{
name:string;
age:number;
}
let tom:Person={
name:'Tom',
age:25
}
通过接口去实现,定义的变量比接口少一些属性是不允许的,多一些属性也是不允许的。
可选属性
在属性后面加上?
interface Person {
name: string;
age?: number;
}
let tom: Person = {
name: 'Tom'
};
任意属性
有时候希望接口允许有任意的属性,可以使用如下方式:
interface Person {
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
name: 'Tom',
gender: 'male'
};
注意:一旦定义了任意属性(为string),那么确定属性和可选属性的类型都必须是它的类型的子集。对于非string类型,不会做限制。
interface Person {
name: string;
age?: number;
[propName: string]: string;
}
let tom: Person = {
name: 'Tom',
age: 25,// index.ts(3,5): error TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'.
gender: 'male'
};
只读属性
有时候希望对象中的一些字段只能在创建的时候被赋值,那么可以用readonly定义只读属性。
interface Person {
readonly id: number;
name: string;
age?: number;
[propName: string]: any;
}
let tom: Person = {
id: 89757,
name: 'Tom',
gender: 'male'
};
tom.id = 9527;
// index.ts(14,5): error TS2540: Cannot assign to 'id' because it is a constant or a read-only property.
4.数组的类型
在TypeScript中,数组类型有多种定义方式:
[类型+方括号]表示法
let fibonacci: number[] = [1, 1, 2, 3, 5];
let fibonacci: number[] = [1, '1', 2, 3, 5];// Type 'string' is not assignable to type 'number'.
数组的项中不允许出现其他的类型。
数组泛型
let fibonacci: Array<number> = [1, 1, 2, 3, 5];
用接口表示数组
interface NumberArray {
[index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
5.函数的类型
js中有两种常见的定义函数的方式——函数声明和函数表达式
// 函数声明(Function Declaration)
function sum(x, y) {
return x + y;
}
// 函数表达式(Function Expression)
let mySum = function (x, y) {
return x + y;
};
函数声明
一个函数有输入和输出时,要在TypeScript中对其进行约束,需要把输入和输出都考虑进去,其中函数声明的类型定义较为简单:
function sum(x:number,y:number):number{
return x+y
}
注意:输入多余或者少于要求的参数,是不被允许的
函数表达
如果我们现在写一个对函数表达式的定义,可能会写完
let mySum = function (x: number, y: number): number {
return x + y;
};
上面是错误的写法。因为只对等号右边的匿名函数进行了类型定义,而等号左边的mySum是通过赋值操作进行推断的。
正确的写法:
let mySum:(x:number,y:number)=>number=function(x:number,y:number):number{
return x+y
}
不要混淆TypeScript中的=>和ES6中的=>
在TypeScript的类型定义中,=>用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型
用接口定义函数的形状
interface SearchFunc{
(source:string,subString:string):boolean;
}
let mySearch:SearchFunc;
mySearch=function(source:string,subString:string){
return source.search(subString) !==-1;
}
可选参数
和接口中的可选属性类似,用?表示可选的参数:
function buildName(firstName:string,lastName?:string){
if(lastName){
return firstName+' '+lastName;
}else{
return firstName;
}
}
let tom=buildName('Tom')