TypeScript高级类型

172 阅读4分钟

class 类

 class Person {
   age: number
   gender = '男'
 }
 1, 声明成员age,类型为number(没有初始值)
 2, 声明成员gender,并设置初始值,可省略类型注解

类的构造函数

  class Person {
  age:number
  gender:string
  constructor(age:number,gender:string) {
  this.age=age
  this.gender=gender
  }
  1.成员初始化(比如,age:number)后,才可以通过this.age来访问实例成员
  2.需要为构造函数指定类型注解,否则会被隐式推断为any;构造函数不需要返回值类型

类的实例方法

class Point {
   x=1
   y=2
   scale(n:number):void {
   this.x*=n
   this.y*=n
}
const p=new Point()
p.scale(10)

类的继承

1.
(1).通过extends关键字实现继承
(2).子类Dog继承父类Animal,则Dog的实例对象dog就同时具有了父类Animal和子类Dog的所有属性
2.
(1).通过implements关键字让class实现接口
(2).Person类实现接口Singable意味着,Person类中必须提供Singable接口指定的所有方法和属性

class类(成员可见性)

类成员可见性:可以使用TS来控制class的方法或属性对于class外的代码是否可见
可见性修饰符包括:1.public(公有的)2.protected(受保护的)2.private(私有的)
protected:仅在其声明所在类和子类中(非实例对象)可见
private:只在当前类中可见

readonly(只读修饰符)

readonly:表示只读,用来防止在构造函数之外对属性进行赋值
1.使用readonly关键字修饰该属性是只读的,注意只能修饰属性不能修饰方法

类型兼容性

对象兼容性

对于对象类型来说,y的成员至少与x相同,则x兼容y(成员多的可以赋值给少的)

接口兼容性

接口兼容性,类似于class,并且,classinterface之间也可以兼容

函数兼容性

1.参数个数:参数少的可以赋值给多的
2.参数类型:相同位置的参数类型要相同(原始类型)或兼容(对象类型)
3.返回值类型:只关注返回值类型本身即可

交叉类型(&)

功能类似于接口继承(extends),用于组合多个类型为一个类型(常用于对象类型)
交叉类型(&)和接口继承的对比:
同名属性之间,处理类型冲突的方式不同

泛型

function id(value:number): number { return value }
function id<Type>(value: Type): Type { return value }

泛型约束收缩类型

1,指定更加具体的类型
将类型修改为Type[]
2,添加约束
创建描述约束的接口
通过extends关键字使用该接口,为泛型添加约束

多个泛型变量的情况

<Type,key extends keyof Type>(obj: Type,key: key)
keyof 关键字接收一个对象类型,生成其键名称

泛型接口

interface IdFunc<Type>{
   id: (value: Type)=> Type
   ids: () => Type[]
   }

数组是泛型接口

泛型类

泛型(工具类型)

Partial<Type>用来构造(创建)一个类型,将Type的所有属性设置为可选
Readonly<Type>用来构造(创建)一个类型,将Type的所有属性设置为只读
Pick<Type,keys>从Type中选择一组属性来构造新类型
Record<keys,>构造一个对象类型,属性键为keys,属性类型为Type

索引签名类型

当无法确定对象中有哪些属性(或者说对象中可以出现任意多个属性),此时,就用到索引签名类型

映射类型

基于旧类型创建新类型
type Type2 = { [key in Propkeys]: number }
注意:映射类型只能在类型别名中使用,不能在接口中使用

type Type3 = { [key in keyof Props]: number }

索引查询类型

T[P] :作用: 用来查询属性的类型
注意:[]中的属性必须存在被查询类型中
type TypeA = Props['a' | 'b']
type TypeB = Props[keyof Props]

TS中的两种文件类型

.ts 代码实现文件
.d.ts 类型声明文件

类型声明文件的使用说明

使用已有的类型声明文件
1,内置类型声明文件
2,第三方库的类型声明文件
(1),库自带类型声明文件
(2),由DefinitelyTyped提供

创建自己的类型声明文件

1,项目内共享类型\
2,为已有JS文件提供类型声明
declare关键字:用于类型声明,为其他地方已存在的变量声明类型,而不是创建一个新的变量