一、基本数据类型
布尔值,布尔值是最基础的数据类型,在TypeScript 中,使用boolean 定义布尔值类型:
let isDone: boolean = false;
数值,使用number,定义数值类型:
num: number = 1;
字符串,使用string 定义字符串类型:
let myName: string = '胖小伙与胖奶奶' ;
//ES6模板字符串
let sentence: string =` Hello, my name is ${myName}`;
空值,JavaScript没有空值(Void) 的概念,在TypeScript中,可以用void 表示没有任何返回值的函数:
function alertName(): void{ alert('My name is 胖小伙与胖奶奶'); }
声明一个void 类型的变量没有什么用,因为你只能将它赋值为undefined 和null
二、任意值(Any)
任意值(Any) 用来表示允许赋值为任意类型。如果是一个普通类型, 在赋值过程中改变类型是不被允许的:
let favoriteNumber: string = 'seven'; favoriteNumber = 7; // 返回: error: Type' number' is not assignable to type" string'
//注意:但如果是any 类型,则允许被赋值为任意类型。例如
let favoriteNumber: any = { num: 'seven' }; myFavoriteNumber.num = 7
在任意值上访问任何属性都是允许的:
let anyThing: any = { myName: { firstName:'胖小伙与胖奶奶' } }; console.log( anyThing.myName); console.log( anyThing.myName.firstName);
也允许调用任何方法:
let anyThing: any = { myName: { firstName:'胖小伙与胖奶奶' }, sayHello: function(){ consle.log('你好,胖小伙与胖奶奶') } }; anyThing.setName( 'Jerry'); anyThing.sayHello();
所以,声名这个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
三、类型推论
如果没有明确的指定类型,那么TypeScript会依照类型推论(Type Inference)的规则推断出一个类型。以下代码虽然没有指定类型,但是会在编译的时候报错:
let favoriteNumber ='seven' ; myFavoriteNumber = 7 //error: Type ' number' is not assignable to type ' string'
事实上,它等价于:
let favoriteNumber: string ='seven' ; favoriteNumber = 7; //error: Type ' number' is not assignable to type' string'.
TypeScript会在没有明确的指定类型的时候推测出一个类型, 这就是类型推论。
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成any 类型而完全不被类型检查:
let favoriteNumber; favoriteNumber = 'seven' ; favoriteNumber = 7;
四、联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。举个栗子
let favoriteNumber: string| number; favoriteNumber =‘seven ' ; favoriteNumber = 7
联合类型使用| 分隔每个类型。这里的let myFavoriteNumber: string | number 的含义是,允许myFavoriteNumber 的类型是string 或者number ,但是不能是其他类型。比如下面这个栗子就会报错:
let myFavoriteNumber: string| number; myFavoriteNumber = true; //error: Type‘ boolean' is not assignable to type' string| number' . 1/ Type 'boolean' is not assignable to type ' number'
访问联合类型的属性或方法
当TypeScript不确定一个联合类型的变 星到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法:
function getLength( something: string| number): number { return something.length; } // error: Property ' length' does not exist on type ' string | number'. // Property 'length' does not exist on type ' number' .
上例中, length 不是string 和number 的共有属性,所以会报错 。访问string 和number 的共有属性是没问题的:
function getString(something: string| number): string { return something. toString(); }
联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:
let myF avoriteNumber: string| number; myF avoriteNumber =‘seven ' ; console. log(myF avoriteNumber .length); // 5 myFavoriteNumber = 7; console . log( myF avoriteNumber . length); //编译时报错 // error: Property ' length' does not exist on type ' number' .
上例中,第二行的myFavoriteNumber 被推断成了string ,访问它的length 属性不会报错。 而第四行的myFavoriteNumber 被推断成了number ,访问它的length 属性时就报错了。
五、接口
在TypeScript中,我们使用Interfaces来定义一 个接类型的对象。
什么是接口
在面向对象语言中,接口(Interfaces) 是一个 很重要的概念,它是对行为的抽象,而具体如何行动需要由类去实现。
TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称作” 鸭式辨型法或结构性类型化”。在TypeScript里,接门的作用就是为这些类型命名和为你的代码或第三方代码定义契约。
举个例子
interface Person{ name: string; age: number ; } let myMsg: Person = { name:' 胖小伙与胖奶奶' , age: 25 }; //上面的例子中,我们定义了一个接口Person,接着定义了一个变量tom,它的类型是Person。 //这样,我们就约束了tom的形状必须和接口Person一致。接口定义的变量比接口少了些属性是不允许的 //如果接口定义存在可选值,那么使用 ‘?’,例如 interface Person { name: string; age?: number; } let myMsg: Person = { name:' 胖小伙与胖奶奶' } //这种编译不会报错
六、数组
存放多个元素的集合,最简单的方法是使用「类型 方括号」来表示数组:
let num1: number = ;//数组的项中不允许出现其他的类型: let num2: number = ;// Type ' string' is not assignable to type ' number'
数组的一些方法的参数也会根据数组在定义时约定的类型进行限制:
let arr: number = ; arr.push('8');// Argument of type '"8"' is not assignable to parameter of type ' number' .
上例中,push 方法只允许传入number 类型的参数,但是却传了一个"g" 类型的参数,所以报错了。这里"g" 是一个字符串字面量类型。
也可以指定个any类型的数组:
let list: any = ;