1. 数据类型
JavaScript的数据类型分为两类:原始数据类型(Primitive data types) 和对象数据类型(Object types)。原始数据类型包括: boolean、number、string、null、undefined以及ES6中新的数据类型 Symbol和 ES10数据类型 BigInt。
2. 数据类型应用
- 布尔型(
boolean)
注意,如果使用构造函数let isOneline : boolean = false ;
Boolean创建的事对象而不是原始类型的布尔值。
编译let isNew: boolean = new Boolean(1) ;
tsc data.ts,提示错误,使用构造函数创建的为对象,并不是boolean类型值。
b. 数值(data.ts:3:5 - error TS2322: Type 'Boolean' is not assignable to type 'boolean'.'boolean' is a primitive, but 'Boolean' is a wrapper object. Prefer using 'boolean' when possible.
number)
编译// 十进制let literal: number = 6 ;//十六进制let hexLiteral: number = 0xf00d// 二进制let binarLiteral: number = 0b1010//八进制let octalLiteral: number = 0o774//不是数值let notNumber = NaN//无穷大let infinityNumber = Infinity
tsc data.ts生成js文件
c. 字符串(// 十进制var literal = 6;//十六进制var hexLiteral = 0xf00d;// 二进制var binarLiteral = 10;//八进制var octalLiteral = 508;//不是数值var notNumber = NaN;//无穷大var infinityNumber = Infinity;
string) ```javascript let myName: string = ‘LelandACM’ ;
let myAge: number = 30
//模板字符串
let setence : string = Hello, my name is ${myName}. I'll be ${myAge + 1} years old next month.;
编译 `tsc data.ts` 生成`js`文件,其中```用来定义模板字符串,`${expr}`用来在模板字符串嵌入表达式。```javascriptvar myName = 'LelandACM';var myAge = 30;//模板字符串var setence = "Hello, my name is ".concat(myName, ". I'll be ").concat(myAge + 1, " years old next month.");
d. 空值(`void`)<br />`JavaScript`总没有空值的概念,在`TypeScript`中,可以用`void`表示没有任何返回值的函数。
function alterName(): void{alert("My name is Tom") ;}
e. null和 undefined类型
在TypeScript和JavaScript中,null和 undefined类型是所有类型的子类型,也就是说任意变量的赋值可以赋值为 null和 undefined。
//undefined类型let u: undefined = undefined;//null类型let n: null = null;//numberlet num: number = undefinedlet nullNum = n//void类型变量不能赋值给numberlet v: void;//- error TS2322: Type 'void' is not assignable to type 'number'.let voidNum: number = v;
f. 任意值(`any`)
let anyThing: any = 'Hello'anyThing = 7
在任意值上访问任何属性和方法都是允许的
//定义任意值类型let anyThing: any = 'Hello'//改变值类型anyThing = 7anyThing = 'LelandACM';//访问任意值属性console.log(anyThing.myName) ;console.log(anyThing.myName.firstName);//访问任意类型的方法anyThing.setName('Jerry') ;anyThing.setName('Jerry').sayHello() ;anyThing.myName.setFirstName('Cat') ;
在变量声明时未指定其类型,则会自动识别为任意值类型。
let something;something = 'seven'something = 7 ;something.setName('Tom')
等价于如下:
let something: any;something = 'seven'something = 7;something.setName('Tom')
g. 类型推断
如果变量在定义时未指定其数据类型,但是赋初值了,那么TypeScript会依照类型推论(Type Inference)的规则推断出一个类型。
// 类型推断let myNumber = 'seven' ;//改变值类型myNumber = 7 ;//编译器会提示错误data.ts:63:1 - error TS2322: Type 'number' is not assignable to type 'string'.
h. 联合类型(Union Type)
联合类型表示取值可以为多种类型中的一种。
// 联合类型let myNumber: string | number;myNumber = 'seven' ;myNumber = 7 ;// 错误类型转换myNumber = true//编译器会提示错误- error TS2322: Type 'boolean' is not assignable to type 'string | number'.
访问联合类型的属性或者方法
当TypeScript不确定一个联合类型的变量到底是哪个类型时,我们只能访问此联合类型的所有类型里共有的属性或者方法
function getLength(something: string | number): number{return something.length ;}
上述示例中,length不是string和number的共有属性,所以会报错。访问共有的属性或方法是可行的。
function getString(something: string | number): string{return something.toString() ;}
联合类型的变量在赋值时,也会根据类型推论规则得出一个数据类型。
let my: string | number ;my = 'seven' ;console.log(my.length) ; //结果输出5my = 7;//my 类型自动推断为number,没有legth属性,编译器会提示错误console.log(my.length) ;//编译报错- error TS2339: Property 'length' does not exist on type 'number'.
上述示例中,my被推断为string,访问length属性是OK的,后续my被推断为number,访问length属性报错,number类型数据无length属性。
