TypeScript | 新增的类型

134 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

1.常用基础类型

   1.js已有类型

    1.基础类型:number,string,boolean,null,undefined,symbol

    2.引用类型:对象,数组,函数

   2.ts新增类型

    1.联和类型,自定义类型,接口,元组,字面量类型,枚举,void,any

2.ts新增的类型

2.1接口

当一个对象类型被多次使用时,一般会使用接口来描述对象的类型,达到复用

 语法:1.用interface 关键字声明接口

interface Iperson {
 name: string
 age: number
}   
let person: Iperson = {
 name: 'ZZ',
 age: 18
}

1.interface和type的区别:

interface(接口)和type(类型别名)的区别:

  1.相同点:都可以给对象指定类型

  2.不同点:

    接口:只能为对象指定类型

    类型别名:可以为任意类型指定别名 (对象时可以用接口/类型别名,其他类型只能用类型别名)

interface Iperson {
 name: string
 age: number
}
 
type Iperson = {
 name: string
 age: number
}
 
type NumStr=number | string


let person: Iperson = {
  name: 'ZZ',
  age: 18,
}
let age:NumStr=12

3.可选属性,只读属性,任意属性

1.可选属性 ?表示

interface Person {
  height: number
  with?: number
}
let zhang: Person = {height: 123}

2.只读属性

1.属性名前用 readonly来指定只读属性

2.ReadonlyArray指定数组为只读

3.readonly vs const

interface Person {
  readonly color: string
  with?: number
}
 let zhang: Person = {color: 'red'}
zhang.color='blue' //error只读

ReadonlyArray指定数组为只读

1.ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了


let a: number[] = [1, 3, 4, 5]
let newA: ReadonlyArray<number> = a
newA[0] //error只读
newA.push(6) //error只读
2.把readonlyArray类型赋值到普通数组不可以,可以使用断言重写
let a: number[] = [1, 3, 4, 5]
let newA: ReadonlyArray<number> = a
let b = []
b = newA //error
b = newA as number[]

readonly vs const

它做为变量使用还是做为一个属性

做为变量使用的话用 const,若做为属性则使用readonly

3.任意属性

无法预先知道有哪些新的属性的时候,可以用

注意:1.一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集

2.一个接口中只能定义一个任意属性。如果接口有多个类型的属性,可使用联合类型

1.interface Person {
  name: string
  age: number
  [propName: string]: string
}
 let jing: Person = {
    name: 'jignjign',
    age: 25,
    gender: 'sex'
  }
//error 报错,因为age是number类型与[propName: string]的string不一致
2.修改
interface Person {
  name: string
  age: number
  [propName: string]: string | number
}

3.继承extends:

如果两个接口之间有相同的属性或方法,可以将公共的属性抽离出来,通过继承实现复用

1.与类一样,接口也可以相互继承

2.一个接口可以继承多个接口,创建出多个接口的合成接口

interface p1{x:number,y:number}
interface p2{x:number,y:numberz:number}
interface p3 extends p1{z:number}
//继承多个接口
interface Person {
  name: string
  age: number
}
interface Person1 {
  content: string
}
interface PersonSon extends Person, Person1 {
  gender: string
}

2.2 元组(Tuple)

元组:是一个已知数量长度,类型的数组,各个元素的类型可以不同

元组类型时另一种类型的数组,元组继承于数组,但是比数组拥有更严格的类型检查。

它确切的知道包含了多少个元素,以及特定所有对应的类型。

let position: [number, string] = [1, '123']
let position: [number, number] = [1, 2]

2.3 字面量类型

字面量类型:某个特定的字符串也可以作为TS中的类型 除字符串外,任意的js字面量(比如:对象,数字等)都可以做为类型使用

let str='hello' 变量,类型是string
const str='hello' 常量,类型是 hello,
                  因为const 是常量不能变所以类型是hello

1.使用场景:字面量类型配合联合类型一起使用用来表示一组明确的可选值列表

eg:在贪吃蛇中,游戏的方向只能是上下左右中任意一个
  function chang(direction: 'up' | 'down' | 'left' | 'right') {
    console.log(999, direction)
  }
  chang('up')

2.4 枚举类型(enum)

 1.作用:枚举用于表示固定的几个取值可以表示一组明确的可选值,枚举的功能类似于字面量类型+联合类型组合的功能  2.枚举:enum关键字 定义一组命令常量,它描述一个值,该值可以是这些命名常量中的一个大写字,逗号隔开,  3. 使用枚举:通过 . 访问枚举成员 4.使用场景:使用一组明确的可选值

1.定义枚举
enum Direction {
    Up,
    Down,
    Left,
    Right
  }
function changF(direction: Direction) {
    console.log(888, direction)
}
changF(Direction.Up)

5.枚举成员的值 枚举成员的值,鼠标移入枚举成员上就可以看见 枚举默认是数字枚举

1.数字枚举

数字枚举:枚举成员的值是数字 字符串枚举有自增长,默认为:从0开始自递增

1.手动初始化枚举
  enum gender { male=2,female }
  可以手动赋值从2开始为元素赋值: male==2,female==3
  enum gender { male=2,female=4 }
  可以全部手动赋值: male==2,female==4
3.获取元素对应得值
  enum gender { male=2,female=4 }
  let val = gender.male  //2
4.根据值映射相应得字段名称
  enum gender { male=2,female=4}
  let val = gender[4]   //female

2.字符串枚举

类似于数字枚举但 字符串不支持正反向映射 字符串枚举:枚举成员的值是字符串 字符串枚举没有自增长,每个成员必须有初始值

1.定义枚举
 enum season {
    spring = 'a1',
    summer = 'a2'
  }
2.获取元素对应得值
  let val = season.spring  //al

3.常量枚举

在编译阶段就会被移除,没有对应的js 场景:当不需要一个对象,而只需要对象的值时,可使用常量枚举。会减少在编译环境上的代码

1.const定义
const enum season {
    spring,
    summer
}

  枚举的特点与原因:   枚举不仅仅当作类型,还提供值,所以说在编译成js代码时不会自动一出,而是会被编译成js代码(开销更大)

4.任意类型(any)

声明为 any 的变量可以赋予任意类型的值 检查器不会对类型进行检查 不推荐使用,失去ts的保护

let list: any[] = [1, true, "free"];
let sum:any = 12;
``