2. 基本数据类型(重点总结)

222 阅读3分钟

重点

ts作为js的超集,js的类型在ts中都有,并且ts在js的基础上扩展了一些类型。

js的类型: string,boolean,number,null,undefined,symbol和BigInt(用处比较少)

ts扩展的类型: 元组,枚举,void,never,any

对象类型:非原始类型如:数组

js自带类型

js自带类型没有什么需要总结得。知识有一个不常用的BigInt,用于超出js数据范围的计算

let a = Number.MAX_VALUE + 1
let b = Number.MAX_VALUE + 2

console.log(b > a) // false

超出范围,无法比较

let a = BigInt(Number.MAX_VALUE) + BigInt(1)
let b = BigInt(Number.MAX_VALUE) + BigInt(2)

console.log(b > a) // true

转换成BigInit进行运算。ps:BigInt不能用于与普通数字类型计算如:BigInt(1) + 1

元祖 & 数组

元组

  1. 元组本身就是数组,定义的时候已经定义好元组的长度,每个位置的数据类型
  2. 元组不能通过索引的方式增加数据
  3. 增加数据只能通过push方法,只能增加定义的数据类型
// 定义的时候就必须初始化
const tuple: [string, boolean, number] = ['xx', false, 11]

// tuple[3] = 'xx' 不能这样扩展
// tuple.push(null) 不能push定义之外的类型
tuple.push(true)
console.log(tuple)

数组

数组的用法与js没什么不同的,注意定义数组的时候需要指定类型,例子:

let arr = []

arr.push(1)

会报错如下,需要指定类型

image.png

let arr:any= []
arr.push(1)
arr.push('22') //接受任意类型
let arr1:number = [] // 接受数字类型的数组

枚举

enum USER {
  'admin',
  'dev'
}

console.log(USER[0], USER.dev) // admin 1

基本用法

(function () {
  'use strict';

  var USER;
  (function (USER) {
      USER[USER["admin"] = 0] = "admin";
      USER[USER["dev"] = 1] = "dev";
  })(USER || (USER = {}));
  console.log(USER[0], USER.dev);

})();
//# sourceMappingURL=bundle.js.map

编译后代码,可以发现其实枚举就是一个对象:{0: 'admin', 1: 'dev', admin: 0, dev: 1}

异构枚举

enum USER {
  'admin' = 1,
  'dev' = 'b'
}

像这种指定值,并且值没有规律,就是异构枚举。

常量枚举

以上两种枚举都能正反都能取值:USER[0], USET.admin。常量枚举不能够反向取值,也就是反举。通常用于定义一些常量

 const enum USER {
  'admin',
  'dev'
}

nerver

nerver的意思就是从不,也就是永远不能到达。在ts中有三种情况不能会得到nerver

  • 报错
  • 死循环
  • 类型判断不完整

nerver用途为:

  • 标识错误
  • 完整性校验(在类型保护章节会遇到)
function MyError():never {
  throw new Error('')
  // 永远不能到这里
}
function whileTrue():never {
  while(true){}
  // 永远不能到这里
} 
function byType(val: string|number) {
  if(typeof val == 'string') {
    val
  } else if(typeof val == 'number') {
    val
  } else {
    // never 永远不能到这里
    val
  }
}
let n:never = whileTrue()

null & undefined

这两个是所有类型的子类型,可以讲其赋值给任何类型(非严格模式下)

void

void 空类型, 只能接受null和undefined,通常用于函数返回值。 严格模式下不能接受null

经典问题

  1. 什么时候标识类型,什么时候不用标识类型

ts自带类型推导。当能够把类型推导出来的时候就不用:

let str = 'str' //此处可以推导出str的类型,可以不用

一些函数的形参,接口里面的约束,类里面的属性。可以带上类型

  1. string String number Number的区别

string是基本类型,而String是string的引用类型。string只能描述基本类型,String技能描述基本类型,也能描述实例。

let str:String = '' // String描述其基本类型
let str1:String = new String('') // String描述其实例

let str2:string = New String() // 报错,string基本类型不能描述String的实例

平常开发中可以不用在意什么时候使用string,什么时候又使用String。js有装箱和拆箱的功能。通常情况下使用string即可。