TypeScript

一、为什么使用TypeScript

如果从类型安全的角度分析,js属于弱类型语言,即具有隐式转换的能力

'100' - 50  //50
'200' + 5 //2005

上面代码中,字符串与数字会根据操作符的不同,进行不同的隐式转换(字符串转数字||数字转字符串)
如果从类型检查的角度去分析,js属于动态类型语言,即声明的变量没有类型,变量的值有类型

let a = 'aaa'
a = 123

这里变量a是没有类型的,这里仅仅是存储了指向内存中某个存储位置的地址,至于这个存储空间存储什么类型的内容,变量a是不做限制的
js作为弱类型、动态类型的语言,会存在很多安全上的问题
1、某些错误只有在程序运行时才会爆出,例如:调用每个对象内不存在的方法
2、对于某些操作,会根据数据的类型不同,实现结果也不同,例如“+”操作符
在最初的设计中,之所有将js设计为弱类型语音,是因为js最初的目的是用来做一些表单验证,这里不需要太多复杂的业务逻辑,这种灵活的语言特性比较适合,目前随着js的应用场景日益复杂,node、小程序、单页应用等等,这种灵活的语言特性成为了它的缺点
TypeScript很好的解决了这个问题,它是js的超级,它除了自身新增的语言特性外,还可以将es2015编译为es5。
使用TS有如下好处
1、某些错误可以在程序的编译阶段爆出,而不是运行阶段
2、在vscode中会有自动提示的功能
3、便于大型项目的重构,例如想要给某个对象内的方法换一个名字,这里我们无需担心某个使用到改方法的地方没有改过来,如果没有改,在编译阶段就会报错了
4、减少不必要的类型判断,例如我们进行某些运算操作之前需要增加判断处理,使用TS则可以省略

二、TypeScript特性简介

1、类型声明

Object类型

const hello:object = {key: 'string'}
const fun:object = (data:string)=>console.log(data)

object类型可以是对象,可以是函数,也可以是数组
如果想仅仅是对象类型

const obj:{str: string, num: number} = {str: 'sss', num: 100}

数组类型

const arry: Array<number> = [1,23]
const arry2: number[] = [1,3,4]

元组类型:固定长度固定元素类型的数组

const arr3: [string, number] = ['222', 333]

枚举类型

enum status {
  statusA,
  statusB,
  statusC
}
enum statusStr {
  statusA = 'aaa',
  statusB = 'bb'
}
const _obj = {
  statu: status.statusA, // 0
  statuB: status.statusB // 'bb'
}

函数声明

function fun1 (a: number, b: number):string {
  return 'stirng'
}
const fun2:(a: number, b?: number | undefined) => string = function (a: number, b?: number):string {
  return 'string'
}

任意类型

let anyType: any = 123
anyType = 'string'
anyType = null

2、类型断言

断定某一个变量是某一种类型,可以使用as关键字或者<>形式,<>不兼容jsx

const arr = [1, 2, 3]
let num = arr.find(i=>i>0);
const num1 = num as number
const num2 = <number>num
console.log(num1 * num1)

3、接口

约束对象的类型

interface Post {
  name: string;
  age?: number,
  readonly sub: string
}
const post:Post = {
  name: 'wss',
  age: 200,
  sub: '88888'
}

let s = post.sub
interface Catch {
  [key: string]: string
}
const c: Catch = {
  sss: '333',
  ssb: '999'
}

4、类

class Person {
  name: string
  private age: number
  protected gender: boolean
  constructor (name: string, age: number) {
    this.name = name
    this.age= age
    this.gender = true
  }
  syaHi (msg: string):string {
    return `hello ${msg}`
  }
}
class Student extends Person {
  constructor (name:string, age: number) {
    super(name, age)
    console.log(this.gender)
  }
}
const tom = new Person('tom', 18)
console.log(tom.name)

const xiaoming = new Student('wwww', 21) 
xiaoming.syaHi('nihao')



class Worker extends Person {
  readonly gender: boolean
  private constructor (name: string, age: number) {
    super(name, age)
    this.gender = false
  }
  static create (name: string, age: number) {
    return new Worker(name, age)
  }
}
const worker = Worker.create('eee', 39)
worker.gender

与es2015相比,增加了属性的类型限制,增加了private、plubic、protected修饰符
其中,private与protected都是限制外部不能访问,protected子类可继承,private子类不可继承
constructor也可增加修饰符,如果设为private,不能使用new操作符

类与接口

声明了某个类应该具有哪些方法,不包含具体实现

interface EatAndRun {
  eat (food: string): void
  run (distance: number): void
}
interface Eat {
  eat (food: string): void
}
interface Run {
  run (distance: Number): void
}
class Person implements Eat, Run{
  eat (food: string): void {

  }
  run (distance: number): void {

  }
}
class Animate implements EatAndRun {
  eat (food: string): void {

  }
  run (distance: number): void {

  }
}

抽象类

与接口的区别时有具体的实现逻辑

abstract class Animate {
  eat (food: string) {
    console.log(food)
  }
  abstract run (distance: number): void
}

class Dog extends Animate {
  run (distance: number) {
    console.log('hhhh', distance)
  }
}
const dog = new Dog()
dog.eat('foooo')
dog.run(300)

泛型

函数在刚开始声明的时候,入参类型不确定,根据类型的不同,返回对应的类型,这时可以使用泛型

function createArry<T> (length: number, value: T): T[] {
  const arr = Array<T>(length).fill(value)
  return arr
}
createArry(3, 'eee')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348