TypeScript常用知识点

100 阅读3分钟
  1. 类实现接口需要用implements关键字来实现,必须实现接口中所有的属性。但是如果类定义自己的属性,是不会报错的。

  2. 接口只能约束类的公有成员,对私有成员是不能约束的,接口约束类的构造函数,也会报错。

interface Human {
  //new (name:string):void 不能约束构造函数!!
  name:string;
  eat():void;
}
// 继承
interface Man extends Human{
  run():void
}
interface Child{
  cry():void
}
// 接口继承class
interface Boy extends Man,Child{}
let boy:Boy ={
  name:'',
  eat(){},
  run(){},
  cry(){}
}
class Asian implements Human{
  name:string 
  //private name:string //这种私有属性是不能在接口中继承的
  constructor(name:string){
  //constructor(public name:string){ //这样就不用在上面先声明了
  this.name=name
  }
  eat(){}
  sleep(){} // 新增的是不会报错的
}
  1. typescript的类型检测原则,也是利用鸭子类型。 即当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。即原类型必须具备目标类型的必要属性。即成员少的兼容成员多的。 但是在接口对象中,是参数多的兼容参数少的。

  2. 交叉类型可以做对象的混入,联合类型可以时类型具有一定的不确定性

  3. 关于面向对象: ts是支持面向对象的。它对js中的class进行了更好的扩展。面向对象的核心封装 继承 多态 抽象

    1. 一般的面向对象将公共的属性,方法放在一个类中(封装)通过 public实例和类以及继承的类都可以使用的属性(默认)、private只能被当前的类使用protected不能给实例对象使用 三个修饰符来增强了 JS 中的类
    2. 可以用extends对父类进行继承, 利用implement放置接口来限制类的属性和方法。
    3. abstract进行抽象,所谓抽象,只是对类进行一个定义,可以归为一个统称。 抽象类的方法必须被子类所实现,抽象的类是不能被实例出来的,但是可以被其他的类进行继承。
    4. 多态,抽象的方法被其他的子类继承时, 不同的子类有不同的操作(多种状态)。
interface DogInterface{
  run():void
}
interface CatInterface{
  jump():void
}
// 联合类型 & 交叉类型 |
let pet: DogInterface & CatInterface = {
  run()
  jump()
}

通过索引类型来限制key

let obj = {
  a: 1,
  b: 2,
  c:3
}
// keyof 可以遍历key值
function getValue<T,K extends keyof T>(obj:T,key:K[]){
  return keys.map(item=> obj[key]) // 返回下标
}
console.log(getValue(obj,['a','b'])) // [1,2]
console.log(getValue(obj, ['e', 'f'])) // TS报错,因为不存在。

映射类型(预先定义的泛型接口):

ReadObj, Partial, Omit, PickObj 等被称为同态。只作用与Obj属性不会作用与其他属性

interface Obj{
  a:string,
  b:number,
  c:boolean
}
// 只读的
type ReadObj = Readonly<Obj>
// 可选的
type PartialObj = Partial<Obj>
// 抽取子集
type PickObj = Pick<Obj, "a" | "b">
//将Obj作为value
type recordObj = record<"x"|"y", Obj> 

条件类型: Exclude<T,U> NonNullable ,

Extract<T,U> 可以从T中抽取类型。

模块化导出

Node:

导出:module.exports = ...

导入:const c1 = require('../c')

ESComment:

导出:export default ... , 或者 export {},

导入:import {} as from ''

ts中的declare可以为外部变量提供声明,主要解决外部变量的问题。 例如我们写sdk的时候,可能用到平台的全局变量例如微信小程序中的 wx 这个全局变量。 我们可以直接在d.ts文件中声明。