02 Typescript中的数据类型

127 阅读5分钟

typescript中为了使代码的编写更规范,编译为es5的代码更有利于维护,增加了类型校验,在typescript中主要给我们规定了以下几种类型

  • 布尔类型(boolean)
  • 数字类型(number)
  • 字符串类型(string)
  • 数组类型(array)
  • 元组类型(tuple)
  • 枚举类型(enum)
  • 任意类型(any)
  • null 和 undefined
  • void类型
  • never类型

js中我们定义一个变量后可以执行如下操作

var a = 'str';
a = 12;
a = false;

但是在typescript中不允许你这么操作,为了使我们代码更规范更有利于维护,ts规定我们定义变量的时候指定类型,ts中定义变量数据类型的方式很简单,就是在变量后面加上冒号“:”然后在写上数据类型 比如说我们规定一个布尔类型的变量

  • 布尔类型(boolean)
let flag: boolean = true;
// flag = 'str'; // 此时给flag赋值其他类型就会报错
  • 数字类型(number)
let a: number = 123;
console.log(a);// 123
// a = 'string';// 错误写法
// a = false;// 错误写法

a = 12.3;// typescript没有整型和浮点型,统一为数值类型	
console.log(a);//12.3
  • 字符串类型(string)
let str: string = 'this is a string';
// str = 12;// 错误写法
// str = false;// 错误写法

str = '你好 ts';
console.log(str); // '你好 ts'
  • 数组类型(array) es5中定义数组的方式
var arr = [1, '煎饺', false];

但是在typescript中定义数组由两种方式

// 1.第一种定义数组的方式
// 指定数组的数据类型,如果指定为number,里面只能存放number类型的数据,如果放其他类型的数据,就会报错
let arr:number[] = [1, 22, 33];
console.log(arr);

let arr1 = ['java', 'js', 'golang'];
console.log(arr1);// ['java', 'js', 'golang']


// 2.第二种定义数组的方法
// 在变量名后加上冒号“:”指定为数组类型Array,并在<泛型>中规定数组存放的数据类型为number,同理只能存放其它类型数据就会报错
let arr:Array<number> = [11, 22, 33];
console.log(arr);// [11, 22, 33]

let arr1:Array<string> = ['java', 'js', 'golang'];
console.log(arr1);// ['java', 'js', 'golang']
  • 元组类型(tuple) 也算属于数组的一种
// 元组类型中可以指定数据的数据类型,如下
let arr: [string,number,boolean] = ['ts', 2.12, true];
console.log(arr);
  • 枚举类型(enum) :概念太长了,简言之就是定义标识符的 比如说
/*支付状态pay_status,0表示未支付,1表示支付 2表示交易成功,但是一段时间我们再拿着代码看的时候,我们忘记了0,1,2代表什么意思。如果我们把pay_status定义成枚举类型,我们会很方便知道里面每一个值代表什么意思
*/
enum pay_status {
  unPay = 0,
  payed = 1,
  success = 2
}
console.log(pay_status.success);

而官方中是这样定义的,如果你没有给它赋值,默认值为索引值
enum Color = {red, blue, orange}
let c: Color = Color.blue;
console.log(c);// 1

// 如果这样赋值呢?red没有被赋值默认为0,blue赋值为5,orange没有赋值按照上一个数据为基准,orange的值就是6
enum Color = {red, blue = 5, orange}
let c: Color = Color.orange;
console.log(c);// 6
  • 任意类型(any) 我们之前给别的数据定义类型的时候,一旦定义,后面就不能改为其他类型
let str: string = '123';
// str = 123;// 如果给num赋值number类型的数据就会报错

我们通any任意类型的话,就可以给变量赋值其他数据类型的数据

let str: any = 123;
str = '你好啊';
console.log(str);// 你好啊
str = true;
console.log(str);//true

任意类型的用处

我们想改变html页面上box为红色,我们的dom操作,虽然代码可以执行,但是在编译的时候会报错,如果我们页面上没有获取这个dom对象,oBox为null,后续操作就报错 我们如果给oBox指定为any类型,就不会报错了

  • null 和 undefined 是其他数据类型的子类型
let num: number;
console.log(num);// undefiend 但是会报错

let num: undefined;
console.log(num);// undefiend,如果我们指定为undefined类型,就不会报错

有时候我们要某个变量,不管有值还是没值都不报错

let num: number | undefined;
num = 123;
console.log(num);// 123

// 定义未赋值
let num: number | undefined;
console.log(num);// undefined

另一个就是null类型

let num: null;
nun = 123;// 报错,虽然编译后的js代码是正确的

let num = null;
num = null;// 不报错

一个元素可能是number类型可能是null类型,也可能是undefined类型

let num: number | null | undefined;
num = 1234;
console.log(num);
  • void类型 表示没有返回任何类型,一般用于定义方法的时候没有返回值 // es5的定义方法
function run() {
  console.log('run');
}
run();

在typescript中为了严谨,如果方法没有返回值就加上void类型

// 正确写法
function run():void {
  console.log('run'); 
}

// 错误写法,指定了返回类型为number
function run(): number {
  console.log('run');
}
run();

// 正确写法
function run(): number {
  return 123;
}
run();
  • never类型 是其他类型(包括 null 和 undefiend)的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 即使 any也不可以赋值给never。 例如,
let a: never;
a = 123;// 报错

never类型是那些总是会抛出异常

或根本就不会有返回值的函数表达式

或箭头函数表达式的返回值类型

// 这意味着声明never的变量只能被never类型所赋值

let a: never;
// a = 123;//报错
a = (()={
  throw new Error('异常')
})()


// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
  while (true) {
  }
}