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}`用来在模板字符串嵌入表达式。
```javascript
var 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;
//number
let num: number = undefined
let nullNum = n
//void类型变量不能赋值给number
let 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 = 7
anyThing = '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) ; //结果输出5
my = 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
属性。