什么是Typescript? Typescrip怎么用?

355 阅读4分钟

一、 Typescrip是什么?

  • TypeScript 是微软开发的开源编程语言, Type + JavaScript(type是类型 => 在 JS 基础之上,为 JS 添加了类型支持
  • 简称:TS,是 JavaScript 的超集
  • TS 官方文档 链接地址

二、Typescrip怎么用?

  • javascript中的变量,循环,函数在ts中正常使用,不需要额外学习语法
  • 学习ts主要是用来改变:
    • 类型
    • 与具体前端开发框架的结合使用

三、为什么要有Typescript

JS 的类型系统存在“先天缺陷”弱类型,JS 代码中绝大部分错误都是类型错误(Uncaught TypeError)类型错误的例子: var num = 18; num.toLowerCase();

这些经常出现的错误,导致了在使用 JS 进行项目开发时,增加了找 Bug、改 Bug 的时间,严重影响开发效率

  • 从编程语言的动静来区分,TypeScript 属于静态类型的编程语言JavaScript 属于动态类型的编程语言
    • 静态类型:编译期做类型检查
    • 动态类型:执行期做类型检查
  • 代码编译和代码执行的顺序:1 编译 2 执行

  • 对于 JS 来说:需要等到代码真正去执行的时候才能发现错误(晚)

  • 对于 TS 来说:在代码编译的时候(代码执行前)就可以发现错误(早)

并且,配合 VSCode 等开发工具,TS 可以提前到在编写代码的同时就发现代码中的错误,减少找 Bug、改 Bug 时间

四、什么是类型注解?

  • TypeScript 是 JS 的超集,TS 提供了 JS 的所有功能,并且额外的增加了:类型系统
    • 所有的 JS 代码都是 TS 代码
    • JS 有类型(比如,number/string 等),但是 JS 不会检查变量的类型是否发生变化,而 TS 会检查
  • TypeScript 类型系统的主要优势:可以显示标记出代码中的意外行为,从而降低了发生错误的可能性
let a = 18 
let b:number = 18 // number 就是类型注解

五、什么是TypeScript类型概述?

可以将 TS 中的常用基础类型细分为两类:

  • JS 已有类型
    • 原始类型,简单类型(number/string/boolean/null/undefined
    • 复杂数据类型(数组,对象,函数等)
  • TS 新增类型
    • 联合类型
    • 自定义类型(类型别名)
    • 接口
    • 元组
    • 字面量类型
    • 枚举
    • void
    • ...

六、数组类型

两种写法

let arr1 = number[] = [1,2,3]
let arr2 = Array<string> = ['a','b','c']

七、联合类型

let arr: (number | string)[] = [1,'a',2,'b'] 

|(竖线)在 TS 中叫做联合类型,即:由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种

八、类型别名-type

定义 type 别名 = 类型

type s = string // 定义  

const str1:s = 'abc'

const str2:string = 'abc'

九、函数定义及统一定义格式

// 普通函数 
function 函数名(形参1: 类型=默认值, 形参2:类型=默认值): 返回值类型 { }  
// 箭头函数 
const 函数名(形参1: 类型=默认值, 形参2:类型=默认值):返回值类型 => { }

定义多个具有相同参数类型和返回值类型的函数时,代码比较累赘

const add = (a:number,b:number):number =>{ return a + b }

const sub = (a:number,b:number):number =>{ return a - b }

type Fn = (n1:number,n2:number)=>number  

const add1 : Fn = (a,b)=>{return a+b }

如果函数没有返回值,那么,函数返回值类型为:void

function greet(name: string): void {   console.log('Hello', name)   // }

十、对象类型

  • JS 中的对象是由属性和方法构成的,而 TS 对象的类型就是在描述对象的结构(有什么类型的属性和方法)
// 空对象
let person: {} = {}

// 有属性的对象
let person: { name: string } = {
  name: '同学'
}

// 既有属性又有方法的对象
// 在一行代码中指定对象的多个属性类型时,使用 `;`(分号)来分隔
let person: { name: string; sayHi(): void } = {
  name: 'jack',
  sayHi() {}
}

// 对象中如果有多个类型,可以换行写:
// 通过换行来分隔多个属性类型,可以去掉 `;`
let person: {
  name: string
  sayHi(): void
} = {
  name: 'jack',
  sayHi() {}
}


// 练习
指定学生的类型
姓名
性别
成绩
身高

学习
打游戏

十一、接口类型

当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的

interface IPerson {
  name: string
  age: number
  sayHi(): void
}


let person: IPerson = {
  name: 'jack',
  age: 19,
  sayHi() {}
}

1.接口,只能为对象指定类型// 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名

2.使用 extends(继承)关键字实现了接口继承