有关type的个人理解

104 阅读5分钟

该文章仅作为备份记录

前置知识点

  1. type会筛选 出 要操作的对象的类型,在后续操作中只会对类型进行操作
  2. 什么是类型,类型可以看做是许多包含了该类型的数值的一个集合,比如number类型就是包含了1,2,3,4等等数值的一个集合,而类型2,类型‘a’就代表了只包它本身这一个值的一个集合
  3. type 跟实例化有些相似
    1. 实例化: 可以看作是为了不影响数据的完整性提高代码的健壮性对类进行一个复制,这个复制品就是实例,然后再在不影响类的情况下对实例进行安全的操作
    2. type: 也是复制,但只会复制类中的类型部分,然后将该类型规范传给type的对象
  4. 元组 跟数组是亲戚
    1. 数组:相同类型的数据的集合
    2. 元组:在定义时就规定了元组内元素的数量,类型,顺序

type的特性与用法 (基本 类 元组 联合 函数)

基本类型

type a=number

类的类型

type A1 = B1
class B1 {
  name:string='a'
  age:number=0
}
let aaasss:A1={
  name:'s',
  age:2
}
type 变量名=类名`   或  ` type 变量名=接口名
  1. 理解为将B1看作一个类型,然后对A1进行type
  2. 此时的A1可以类似的看作是接口,是没有值的,就算类B1中已经对实例成员进行了初始化,但因为type只对类型进行操作,所以只会把B1的类型模板传给A1,
  3. 在传递完类型之后里面并没有值,所以不能通过 A1. 的方式来点出自己想要的元素
  4. 可以通过类似接口创建接口对象的方式进行赋值

元组类型

type A3=[3,2,string]
let a3False:A3=[2,2,'a']   //错
let a3True:A3=[3,2,'a']    //对

type A33='a'
let a33True:A33='a'    //对
let a33False:A33='b'   //错

type 变量名=数组

  1. 注意此处A3后面不能加[]
    1. 也许是因为之前说过的type后只会对类型进行操作
  2. 注意因为type只会对类型进行一个操作,所以此处[3,2,string]并非一个数组,而是一个指定了外壳为数组外壳,里面元素为各自对应类型的一个类型数组
  3. 像是代码中单个数字3或者是2这种元素的类型就是他自己本身
  4. 注意空数组不代表什么都没有,空数组的类型是数组,所以可以被type获取到数组类型,同时因为数组内没有元素,也就没有限制,所以之后可以定义任意类型
  5. 这里的数组并不是平常的数组而是元组,可以将其理解为成一个包含了数组中所定义的类型和各自类型对应位置的一个整体

元组和数组不同,元组在定义时就规定了数量和类型,数量指元组里面有多少个元素,类型就是上文中的 3,2,string ,区别于数组,数组里面的 3,2 是数值,而不是类型

元组相当于一个模板

数组相当于一个存储数据的一个集合

元组与数组 的关系有点像接口和对象的关系

a[1,2,3]这个数组中每一个元素都是符合a结构的元组,换句话说,数组a中每一个元素都是一个规定了数量和类型的不可更改的整体

联合类型

type Status =boolean|'a'|number
let StatusObject:Status='a'
let StatusObject1:Status=2
let StatusObject2:Status=true
type 变量名 =类型1|类型2|类型3|......
  1. 注意=后面的是用|连接,所以意思是三个里面的其中一个类型,若要多个类型,则要使用type接口的方式或者直接使用接口

函数类型

type Call=(arg:string)=>number    //对
type Call1=(arg:string)=>{        //错
  return 'a'
}
function testFunc(){     //type无法使用
  return 'a'
}
function testFunc1(){}   //type无法使用
////调用
type a=(num:number,num1:number)=>number
let  aa:a=(a,b)=> {
  return a + b
}
let  res=aa(1,2)

定义:type 变量名=(参数)=>返回值类型

调用:定义一个符合type的函数的类型的函数,然后正常方法调用你定义的函数就行

总结:

  1. type就是一个对操作对象和被操作对象的类型进行操作的一个关键词
  2. type的=后面可以跟任何其内部拥有明确类型的数据
    1. 像是 type 变量名={} 这种就会报错,因为 type 变量名={} 的对象字面量{}是any类型,对象字面量的结构和属性在定义时是灵活可变的,缺乏明确和固定的类型约束,并且any意味着你可以给 a 赋予任何类型的值,这样可能会导致在运行时出现难以预测的错误,因为类型检查不够严格
  3. type只会对类型进行操作
  4. type的作用有两个:
    1. 将type的对象过滤掉其他性质,仅保留类型
    2. 对对象的类型进行操作
  5. 可以将变量,数值看作为类型的一种变体,
    1. 变量a可以看作是一个只有他自己本身的一个对象
    2. 接口a可以看作是一个有
  6. type的使用逻辑:
    1. 先type一个变量名
    2. 将等号后面的元素的类型传给该变量
    3. 此时,该变量就成了一个拥有该元素类型的类似接口的东西
  7. type区别于interface,type是检测=后面的元素的类型然后赋给type的对象,而interface是创建一个对象,里面规定了想要使用该对象的其他对象的类型
    1. 所以要注意type后的元素不能为空,因为空没有类型,值得注意的是空数组的类型是数组类型
  8. type中=后面的数组不是常规情况下的数组,而是元组
  9. type的用法
    1. 类型别名
      1. 接口类型 =接口名
      2. 数值类型 ='a' true 2 ....
      3. 类类型 =类名
    2. 元组类型
    3. 联合类型
    4. 函数类型