###原始数据类型
ts和js一样,类型分为两种:原始数据类型和对象类型 原始数据类型包括:布尔值,数字,字符串,null,undefined 以及es6中的Symbol
基本类型的定义和声明
1.布尔值
let isDone:boolean = false;
注意:使用构造函数Boolean创造的对象不是布尔值
let createdNewBoolean:boolean = new Boolean(1);
//编译错误
//new Boolean()返回的是一个Boolean对象
let let createdNewBoolean:Boolean = new Boolean(1);
let num:number = 123;
let str:string = 'I love China';
let bool:boolean = false;
2.数值
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
// ES6 中的二进制表示法
let binaryLiteral: number = 0b1010;
// ES6 中的八进制表示法
let octalLiteral: number = 0o744;
let notANumber: number = NaN;
let infinityNumber: number = Infinity;
//编译后的结果
var decLiteral = 6;
var hexLiteral = 0xf00d;
// ES6 中的二进制表示法
var binaryLiteral = 10;
// ES6 中的八进制表示法
var octalLiteral = 484;
var notANumber = NaN;
var infinityNumber = Infinity;
3.空值:JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数:
function alertName(): void {
alert('My name is Tom');
}
//声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null
let unusable: void = undefined;
void 类型的变量不能赋值给 number 类型的变量:
let u: void;
let num: number = u;
//// Type 'void' is not assignable to type 'number'.
4.Null 和 Undefined:在 TypeScript 中,可以使用 null 和 undefined 来定义这两个原始数据类型
// 这样不会报错
let num: number = undefined;
// 与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:
// 这样也不会报错
let u: undefined;
let num: number = u;
5.任意类型 any任意值(Any)用来表示允许赋值为任意类型。 什么是任意值类型
//如果是一个普通类型,在赋值过程中改变类型是不被允许的
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
//但如果是 any 类型,则允许被赋值为任意类型。
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;
未声明类型的变量
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
let something;
something = 'seven';
something = 7;
等价于
let something: any;
something = 'seven';
something = 7;
something.setName('Tom');
####定义数组的方式
//第一种方式
let numArr:number[] = [1,2,3,4,5];
let strArr:string[] = ['1','2','3'];
//第二种方式
let arr:Array<number> = [1,2,3,4,5];
let arr1:Array<string> = ['1','2','4'];
####元组:表示数量和类型已知的数组,也是数组,不过数组的长度,和数组元素的类型是已知的
let pengStr:[string,number] = ['23',23]
注意:在给元组赋值的时候,长度要保持和声明的长度保持一致,类型要一一对应,不能颠倒
####数组和元组的区别
元组
1.每一项都可以是不同的类型
2.有预定义的长度
3.用于表示一个固定的结构
数组
1.每一项都是同一种类型,除了any类型的数组
2.没有长度限制
3.用于表示一个列表
####枚举
1.普通枚举
1.实现考虑一个变量的所有可能的值,尽量用自然语言中的单词表示它的每一个值,比如性别,月份,星期,颜色,学历,单位等
enum Gender{
GIRL,
BOY
}
let g1:Gender = Gender.GIRL
let g2:Gender = Gender.BOY
console.log(Gender); //{ '0': 'GIRL', '1': 'BOY', GIRL: 0, BOY: 1 }
console.log(g1,g2); //0 1;
enum Week{
MONDAY = 1,
TUESDAY = 2
}
console.log(Week); //{ '1': 'MONDAY', '2': 'TUESDAY', MONDAY: 1, TUESDAY: 2 }
注意:默认情况下,枚举类型索引是从0开始的,依次往后推,如果给的值是数字,按顺序赋值,不然乱序
2.常数枚举 常数枚举和普通枚举的区别是,它是在编译阶段被删除,并且不包含计算成员,假如包含了计算成员,则会在编译阶段报错
const enum Colors {
Red = 'a',
Yellow = 'b',
Green = 'c'
}
//console.log(Colors); //报错 不能直接打印这个常量枚举,因为在编译阶段会被删除,只能通过属性来调用,不能直接调用
console.log(Colors.Red,Colors.Yellow,Colors.Green); //只能这样写
console.log(Colors[0]); // 也不可以这样写
####never类型 永远不知道什么类型
使用场景
1. 如果一个函数永远不会返回或者陷入死循环,那么他的返回值类型就是never
typescript function sum():never{ while(true){ } }
2.如果一个函数一定要抛出一个错误,那它永远不会正常结束,它的返回类型也是一个never
typescript function nums():never{ throw Error('我错了') }
#### void 和 never的区别
1.void可以被赋值为null和undefined,never则是一个不包含值的类型
2.拥有void返回值类型的函数能正常运行,拥有never类型的返回值类型的函数无法正常返回,无法终止或抛出异常
#### 断言 就是强行告诉ts是一个什么类型,类型断言可以将一个联合类型的变量,指定一个更加具体的类型
```typescript
let names:number|string|null;
console.log((names as string).length);
console.log((names as number).toFixed(2));
```
####字面量类型 可以把字符串,数字,布尔值字面量组成一个联合类型
```typescript
type zType = 1|'one'|true;
let t1:zType = 1;
let t2:zType = 'one';
let t3:zType = true;
```
#### 字符串字面量 vs 联合类型
1.字符串字面量类型用来约束取值只能是某几个个字符串中的一个,联合类型表示取值可以为多种类型中的一种
2.字符串字面量限定了使用该字面量的地方仅接受特定的值,联合类型对于值并没有限定,仅仅限定值类型需要保持一致