ts数据类型

ts数据基本数据类型

声明了类型之后,变量的类型不能改变

一根竖线| :表示或者,用来连接多个类型(联合类型)

问号?代表可选

&表示且

布尔值类型boolean
let bool:boolean=true
数字类型number
let num:number=10
字符串类型string
let str:string="年少不知富婆好,错把美貌当成宝"
undefined类型
const und:undefined=undefined
null类型
const nul:null=null

null和undefined是其他类型的子类型,可以赋值给任意类型

数组类型Array
let arr:number[]=[1,2,3]

let arr:Array<number>=[10,20,30]

let arr:Array<nunber|string>=["hello",100,200]

数组定义后,里面的数据类型和定义数组的时候必须是一致的,否则会报错

元组类型tuple
let yuanZu:[string,number,boolean,undefined]=['haha',10,true,undefined]

元组是ts新增的数据类型,可以理解为固定长度,每个位置数据类型固定的数组

枚举类型enum
enum Color {
    red,
    blue,
    yellow,
  }

  let color = Color.red;
  console.log(color); //0
  console.log(Color[2]); // yellow
  
  enum Sex {
    男 = 1,
    女,
  }
  console.log(Sex.男); //1
  console.log(Sex[2]); //女

枚举中的每个元素都有一个编号,默认从0开始,后面递增1;但是我们也可以自己定义,eg从1开始

枚举可以通过元素获取编号,也可以通过编号获取对应元素

元素可以直接是中文,但是我们不建议这么写

any类型
let anyType: any = 100;
  anyType = "窗前明月光,起来区开窗;被赏一耳光,牙齿全掉光";
  console.log(anyType);
  let a: any[] = [false, 666, "hello"];

可以是任意类型,好用,但是编译的时候没有报错提示;相当于直接使用js语法

unknown类型

和any相似,都可以给任何类型的值赋值给变量;

但是如果将这个变量复制给一个已知类型的变量,unknow会报错,而any不会

let unknowType: unknown;
  unknowType = 10;
  unknowType = "str";
  console.log(unknowType);
  let c = unknowType;
  let d = 12;
  d = unknowType;  // 这一行会报错,因为d已经推断出来是数字,不能将unknown赋值给数字类型的,而如果是    any的话就不会报错,undefined,null,any都可以赋值给任意类型
void类型
function doSomething(): void {
    const str: string = "只要富婆把握住,连夜搬进大别墅";
  }
  doSomething();
  
  // 给void赋值,意义不大
  //   let vo: void = null/undefined;

在函数声明的时候,小括号后面使用void,代表该函数没有返回值 (也等价于函数返回undefined或null)

对象类型object
interface Person {
    age;
    name;
    height;
  }

  function getFitResult(obj: Person): object | boolean {
    const singleMale = {
      name: "Luca",
      age: 24,
      height: 180,
    };

    if (singleMale.age - obj.age <= 5 && singleMale.height - obj.height < 15) {
      return singleMale;
    } else {
      return false;
    }
  }

  const re = getFitResult({ name: "Ari", age: 24, height: 168 });
  console.log(re);

let a:{name:“孙悟空”}

let a={name:“孙悟空”,age?:number}

let a={name:“luca”,[propName:string]:any} ,必须有name,还可以有其他任意类型属性

联合类型union
let a:number|string=20
a="hello"

表示可以是多种类型中的一种

表格形式

类型

实例

描述

number

0,12,-20

任意数字

string

“hello”

任意字符串

boolean

true/false

布尔值true/false

字面量

其本身

限制变量的值就是改字面量的值;有点类似与const,声明了就不能改

any

*

任意类型,设置为any,相当于对该变量关闭了TS,与js差不多

unknown

*

类型安全的any

void

空值(undefined)

没有值(或undefined);多用于函数没有返回值

never

没有值

不能是任何值,可用于函数报错

object

{name:“luca”}

任意对象;{}用来指定对象中包含哪些属性,属性后加上问好,表示可选

array

[1,“fun”,true]

任意数组

tuple

[4,5]

元组,TS新增类型,固定长度的数组

enum

enum{A,B}

枚举,TS新增类型

undefined

undefined

任意类型的子类型

null

null

任意类型的子类型

其他相关概念

类型断言

告诉编译器,我知道是什么类型,知道自己在干什么

语法:

变量 as 类型
<类型>变量
function getLength(str: string | number) {
  由于接收的参数可能是数组,数字没有length,直接用会报错,所以使用类型断言来解决
    if ((<string>str).length) {
      // 如果存在长度,那么是字符串
      return (str as string).length;
    } else {
      return str.toString().length;
    }
  }

类型推断

如果没有指定变量类型,他会根据赋值情况,推断出一个类型

如果声明的同时赋值,那么TS可以自动对变量类型进行检测;所以声明并赋值,可以省略类型的声明

只声明,不复制,解析器会把他设置为any(隐式any)

let a=100  推断为number
let b   //推断为any