typescript从0到1全过程总结+vue整合typescript

TypeScript 是 JavaScript的一个超集

1. 下载:

npm install typescript -g  

2. 生成配置文件(tsconfig.json): 解决VsCode 红色下滑线警告

tsc --init

3. 运行:

tsc ts文件名.ts

可通过 -w 实时监听ts文件的改变 ,执行tsc : tsc ts文件名.ts -w

 

注意事项:

  1. TS 需要编译成 JS 才能被浏览器所解析
  2. 即使typescript编译报错,也可以生成js文件

 


数据类型:

 

字符串类型:

数字类型:

布尔类型:

数组类型:

元祖类型:

 枚举类型:

any类型:(任何类型)

 void类型:(空类型:用于函数是否有返回值)

undefined 和 null 类型:

联合类型:(可以是指定中的任何一种类型)

类型推论:(定义变量时没有赋值则推论为any类型,赋值则为初始时的类型)

类型断言:(当值的类型不确定时,手动指定一个值的类型)


函数

 

函数的参数

可选参数: (?)

剩余参数:(...)

函数的重载:


接口:(行为的抽象,对数据的约束)

接口的定义: interface 接口名 {}           规范的接口名: I接口名首字母大写 (I:interface)

实现接口: implements 接口名

  1. 定义接口时,只需要声明即可,不包含具体的实现
  2. 实现接口时,必须实现接口中的内容

应用场景:当一个东西,必须有一个或多个功能时,即可定义为一个接口。

例如:打印机(每台打印机都有一个打印功能)

/** 定义一个打印机接口
 * 内部存在一个打印功能(函数) 只需要声明,不包含具体实现
 */
interface Iprint {
  printing(mes: string): string
}

// 对接口的继承
interface Ipeintmes extends Iprint {
  getMes(mes: string): void
}
// 实现 Ipeintmes 接口 ,必须实现 Ipeintmes接口中的方法和继承至 Iprint接口中的方法
class Printe implements Ipeintmes {
  printing(mes: string): string {
    return mes
  }
  getMes(mes: string) {
    console.log(mes)
  }
}
var printe = new Printe()
printe.getMes('HP1001-1')

// ----------------------- 对类的约束------------------------------
/**实现接口 : implements 接口名
 * 必须实现接口中的内容
 * (如果要实现多个接口,在接口名称后面逗号分隔即可)
 */
class Printer implements Iprint {
  printing(mes: string): string {
    return '打印了' + mes
  }
}

var pri = new Printer()
var value = pri.printing('简历')
console.log(value)

// ---------------------- 对函数的约束 ---------------------------
/** function 两个参数,第一个参数是字符串类型,第二个参数是数字类型,返回值是布尔类型 */
interface Ifunc {
  (a: string, b: number): boolean
}
var fun1: Ifunc
fun1 = (a: string, b: number) => {
  return false
}
// 函数 fun1 参数不能改变类型
// fun1 = (a: number, b: number) => {   无法编译
//   return false
// }

// -------------------- 对数组的约束 ---------------------------
interface Iarr {
  [index: number]: string
}
var array: Iarr
array = ['12', '2', '3']
// array = ['12', '2', '3', 1]  数组只能是字符串类型  无法编译

// ------------------- 对json 的约束 --------------------------
interface Ijson {
  name: string
  readonly age: number // 只读属性 readonly
  email?: string // 可选属性 ?
}
function showJson(data: Ijson) {
  // data.age = 16   age 为只读属性,不可被更改   无法编译
  console.log(JSON.stringify(data))
}
showJson({ name: 'vs', age: 18 })
showJson({ name: 'vs', age: 18, email: '110' })
// showJson({ name: 'vs', age: '18' })  age为number类型 无法编译

 

类的定义: (class)

类的继承:(extend) 继承与上面的Person类

使用:

var stu1 = new Student(1)
console.log(stu1.getMes())

 

访问修饰符:

  • public(共有的/默认) 可以在任意范围内使用
  • private(私有的)只能在当前类内部使用
  • protected(受保护的)只能在父类或继承父类的子类内部使用
class Father {
  public name: string
  private age: number
  protected email: string
  constructor(name: string, age: number, email: string) {
    this.name = name
    this.age = age
    this.email = email
  }
  getMyMes() {
    console.log(
      'name:' + this.name + ',age:' + this.age + ',email:' + this.email
    )
  }
}
class Child extends Father {
  getMes() {
    console
      .log
      //   'name:' + this.name + ',age:' + this.age + ',email:' + this.email
      // this.age 无法编译
      ()
  }
}
var child = new Child('吕布', 18, '123456@qq.com')
console.log(child)
console.log(child.name)
// console.log(child.age) // age 为 私有属性,无法在Father类外部访问
// console.log(child.email) // email 为 受保护属性,无法在Father类与Child类外部访问

 

静态属性和静态方法(当一个属性或方法不依赖与实例化出来的一个实例,即可使用静态)

 

多态:(同一个父类中的方法,不同子类有不同的实现)

class Animal {
  eat() {
    console.log('animal eat')
  }
}
class Cat extends Animal {
  eat() {
    console.log('猫吃鱼')
  }
}
class Dog extends Animal {
  eat() {
    console.log('狗吃骨头')
  }
}
var dog = new Dog()
dog.eat()

 

抽象类和抽象方法:

  1. 抽象类是提供其他类继承的基类(父类),不能直接被实例化
  2. 抽象方法只能包含在抽象类中,但是抽象类中可以包含抽象方法和非抽象方法
  3. 子类继承抽象类时,必须实现抽象类中的抽象方法(除非子类自身也是一个抽象类)
  4. 抽象方法只提供一个方法,没有具体的实现,如同接口一般

抽象类的定义 : abstract class { }

abstract class Animal0 {
  abstract eat(): void // 抽象方法,只提供了一个方法,并没有具体实现
  run() {
    console.log('run run run ')
  }
}
class Rabbit extends Animal0 {
  eat() {
    console.log('兔子吃草')
  }
}
class Cattle extends Animal0 {
  eat() {
    console.log('牛吃草')
  }
}
var rabbit = new Rabbit()
rabbit.eat()
var cattle = new Cattle()
cattle.eat()

内置对象

/** JS的内置对象
 * Boolean
 * Number
 * String
 * Date
 * RegExp
 * Error
 */
// 大写的声明类型 是 需要 new 的一个对象
let b: Boolean = new Boolean(1)
// let b1:boolean = new Boolean(0) // 编译失败
let n: Number = new Number(3)
let s: String = new String('111')
let d: Date = new Date()
let r: RegExp = /^1/
let e: Error = new Error('error message')

/**DOM 和 BOM 的内置对象*/
const div: HTMLElement = document.getElementById('test')
const divs: NodeList = document.querySelectorAll('p')
document.addEventListener(
  'click',
  (event: MouseEvent) => {
    console.log(event.target)
  },
  false
)
const fragment: DocumentFragment = document.createDocumentFragment()

声明文件

  •  当使用第三方库时,需要引用它的声明文件,才能获得对应的代码补全、接口提示等功能
  •  声明语句:如果需要ts对新的语法进行检查,需要加载对应的类型说明代码
  •  declare var jQuery:(selector:string) => any
  •  声明文件:把声明语句放到一个单独的文件(jQuery.d.ts)中,ts会自动解析到项目中所有的声明文件
  • 下载声明文件 npm install @types/jquery(第三方库名) --save-dev


泛型

泛型是指 在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的使用再指定类型中的一种特性

定义泛型 :  < T >                 T(泛型名称,默认统一为T)

使用泛型

 

泛型函数:

function itemValue<T>(arr: T[]): void {
  for (var item of arr) {
    console.log(item)
  }
}
itemValue<number>([11, 22, 33])  // 指定泛型为number ;函数中的参数,数组中的每一个元素必须是数字类型
itemValue(['aa', 'bb', 'cc'])

 

泛型类:

class ArrList<T> {
  list: T[] = []
  add(val: T): void {
    this.list.push(val)
  }
}
var arrlist = new ArrList()
arrlist.add(1)
arrlist.add(23)
console.log(arrlist)

 

泛型接口:

interface Iport<T> {
  (x: T, y: T): T
}
var iport1: Iport<number>
iport1 = function(x: number, y: number) {
  return x + y
}
console.log(iport1(6, 1))
// console.log(iport1())

命名空间:

  1. 为了避免各种变量命名冲突,可将相似功能的函数、类、接口等放置到命名空间
  2. 定义命名空间 namespace 名称 { }
  3. 访问命名空间内部的成员,需要 export 将其导出

模块定义:

export namespace A {
  interface IAnimal {
    name: string
    eat(): void
  }
  export class Dog implements IAnimal {
    name: string
    constructor(name: string) {
      this.name = name
    }
    eat() {
      console.log(`${this.name}啃骨头`)
    }
  }
  export class Cat implements IAnimal {
    name: string
    constructor(name: string) {
      this.name = name
    }
    eat() {
      console.log(`${this.name}吃鱼`)
    }
  }
}
export namespace B {
  interface IAnimal {
    name: string
    eat(): void
  }
  export class Dog implements IAnimal {
    name: string
    constructor(name: string) {
      this.name = name
    }
    eat() {
      console.log(`${this.name}吃肉`)
    }
  }
  export class Cat implements IAnimal {
    name: string
    constructor(name: string) {
      this.name = name
    }
    eat() {
      console.log(`${this.name}吃老鼠`)
    }
  }
}

使用模块:

 


Vue-Cli3创建typescript项目:

Vue-cli3创建的TypeScript 项目 针对于 vue-property-decorator(非Vue官方)搭建

而 vue-property-decorator 完全依赖于 vue-class-component(Vue官方)搭建。

vue-class-component        

vue-property-decorator

 

vue-property-decorator在原基础上新增了十多个装饰器,具体可以看文档,已在上面贴出了文档地址链接

这里只对个别经常用的做演示

 

 

@Component  子组件的改变 (完全继承于vue-class-component的方式实现)

@Prop 父组件向子组件传值

 

@Watch  监听组件中的改变

@Emit  子组件向父组件传递事件,进行通信

 

 

 

代码源地址