0
点赞
收藏
分享

微信扫一扫

TypeScript基础知识

数数扁桃 2022-02-05 阅读 55

TypeScript

https://www.tslang.cn/

全局安装: npm i -g typescript

转换命令: tsc xxx.ts

类型

// JS的缺点: 只有动态错误分析 没有 静态错误分析

// 高达有个想法: 拿刀出去溜达一圈...
// 动态分析: 出去溜达... 被抓了
// 静态分析: 不需要真的出去, 立刻告知: 不可以

// JS: 运行时才有报错 -- 程序员无法在书写时立刻知晓错误
// TS: 强类型语言, 可以在代码中规定变量的类型
//    变量类型声明语法:   变量名: 类型名
function show(a: string) {
  // 优势: 工具看到 a是string类型, 则使用时自动给出代码提示
  // a.
  console.log(a.toUpperCase())
}
// 静态报错分析: 编程软件会直接分析代码, 类型不同则立刻给出错误提示 -- 把错误扼杀在萌芽里
// show(1)
show('mike123')

// 问题: TS语言是让程序员书写时比较好用, 但是浏览器不能识别TS代码, 需要转换成JS代码才能执行
// 转换工具需要安装: npm i -g typescript
// 转换命令: tsc xxx.ts

// TS文件会自动分析, 当前编辑器开启的所有文件 会认为是一个整体, 会合并操作
// 如果多个打开的文件 有同名的 变量/方法, 则会自动报错提示

let a: number //数字类型
a = 11
a = 1.2
a = null
a = undefined
// a = true
// a = false
// a = '333'

let b: boolean = true
let c: string = '333'

// any: 任意类型 -- 默认为任意类型, 类似JS的弱类型
let d: any
d = 1
d = true
d = 'mike'

// 自定义可选类型:  用|间隔, 代表两种都可以
let e: string | number
e = 'mike'
e = 12
e = true

// 把开启的其他文件关闭, 否则重名变量会报错

// Array<类型> : 数组中,每个元素都会指定类型的
let a: Array<string>

a = ['mike', 'lucy', 12, true]

// 简化写法:
let c: string[]
c = ['mike', 'lucy', 12, true]

// 指定元素个数和类型
let d: [string, number, boolean]
// d: 3个元素, 顺序是 字符串, 数字, 布尔类型
d = ['mike', 23, 11] //类型错误报错
d = ['mike', 23, true]
d = ['mike', 23, true, 44] //个数错误报错

// 对象类型都需要自定义
let a: object
// object: 任意对象类型, 值随意
a = { x: 10, y: 10, z: 100 }

// 新的关键词: interface
interface Employee {
  eid: string
  eage: number
  ename: string
  married: boolean
}

let b: Employee

b = { eid: '10001', eage: 22, ename: 'mike', married: true }

// 商品: 价格 名字 数量
interface Product {
  price: number
  name: string
  count: number
}

let p1: Product = { name: 'iPhone14', price: 9999, count: 34 }

面向对象相关

// 面向对象
class Demo {
  // 提前声明属性, 方法中才能 this.属性名 来使用
  name: string
  age: number

  //构造方法: new关键词触发
  constructor(name, age) {
    // 在JS中直接  this.属性名 = 值 是可以的, 如果属性名不存在会自动创建新的
    // 在TS中, 作者希望防止写错单词 导致错误的属性声明, 所以要求提前声明属性 再使用
    this.name = name
    this.age = age
  }
}

new Demo('mike', 33)

// 私有属性
// 权限词: 不同的属性可以拥有不同的权限, 限定其使用范围, 更加的安全可靠.
// public   公开的
// protected 保护的
// private  私有
class GaoDa {
  // 实际上每个属性都有权限词, 默认是public 公开的
  public name = '高达'
  // protected: 保护 -- 外部无法访问
  protected money = '99999'
  // private: 私有 -- 子类无法访问, 只有当前类能用
  private avi = '高达的小电影'
}

// 子类
class Son extends GaoDa {
  show() {
    // 子元素可以访问父元素的公开和保护的属性
    this.name
    this.money
    this.avi
  }
}

// GaoDa 类的外部
let gd = new GaoDa()
gd.name
// 类外只能访问 类的公开属性
gd.money
gd.avi

// 接口: interface
// 接口就是一个规定: 要求对象类型必须实现哪些属性

interface NvXu {
  money: number
  maiFang(): void //()说明是个方法,  void代表没有返回值
  maiChe(): void
}

// implements: 承诺实现 指定的接口标准
class GaoDa implements NvXu {
  // 必须在类中书写接口中规定的属性, 才不会爆红
  money: number
  maiChe(): void {}
  maiFang(): void {}
}

导出与导入

// 导出
// JS的旧语法 module.exports = {}
// JS的新语法 export default {}
// TS的写法  export {}
function mapState() {}
function mapGetters() {}

export { mapState, mapGetters }

// 导入

import { mapGetters, mapState } from './08.模块的导出'

mapGetters()
mapState()

举报

相关推荐

0 条评论