快速上手TypeScript

本文详细介绍了TypeScript在JavaScript开发中的优势,包括类型检查、语言扩展、类型推断等,通过示例展示了如何在函数、基本类型、接口、类和泛型等方面使用TypeScript。
摘要由CSDN通过智能技术生成

目录

00.demo

01.工具配置

02.基本类型

03.函数类型

04.接口

05.类

06.接口与类的使用

07.泛型

js本身语法 类型太弱了 不适合 开发后端 复杂业务

引入ts 代码写起来严谨 可阅读性强很多,更有利于团队开发

优点:

1.类型检查

2.语言扩展

3.类型推断机制

4.代码设计,团队合作

demo01

//-->ts写法
function addTen2(n:number){
  return n+10
}
addTen2(10)
addTen2('10')

 编译时就可以发现问题:

//强类型 :不允许复制给其他类型  (编译时报错,检测类型)

01.工具配置

1.安装Typescript编辑器:tsc指令

npm i -g typescript

2.转换成JS文件

PS C:\Desktop\软件开发\前端\ts> tsc hello.ts

3.设置同步监听

PS C:\Desktop\软件开发\前端\ts> tsc --watch

4.修改生成js文件目录

02.基本类型

举例实例

/**
 * 01 基本类型
 * 02 数组 & 元组
 * 03 更多内置模块
 */

//公式 变量名:类型 =赋值
/**
 * 01 基本类型
 */

//01 string
//js
// let p_name ='phdvb'
//ts
let p_name: string='phdvb'
//ts 模板字符串
let nameStr: string=`姓名: ${p_name}`


//02 number
let p_age: number =23 
let num_16: number =0xfff

//03 boolean
let flag: boolean=true

//04 any 慎用
let anything:any ='hello'
anything =7
anything.lklsf

function divide(param: any){
  return param/2
}
divide('123')//报错

// 05 unknown 安全
function divide2(param: unknown){
  return param as number /2 //编写时提示报错  -->断言不会报错
}

//06 undefined(未定义)  07 null(空对象) ,是所有类型的子类型。配可选参数
let abc: null =null

//void 没有返回值
function fn1():void{
}

//never 永远不可能有返回值类型  --》true
function fn2():never{
  throw Error('error msg')
  while(true){}
}

/**
 * 02 数组+元组
 */
let fruits: string[] = ['apple','orange','banana']
// fruits.push(23)
fruits.push('watermelon')

//元组
let turple: [string,number,boolean] = ['apple',5,false]

/**
 * 03 更多的内置类型
 */
const d: Date =new Date()
const r: RegExp =/abc/

//Dom 和 Bom
const div:HTMLDivElement = document.createElement('div')
document.addEventListener('click',function(e: MouseEvent){
  
})

03.函数类型

/**
 * 01 定义函数的三种方式
 */
//声明方式
function add(x:number,y:number):number{
  return x+y
}
//表达式方式
let add2 = (x:number,y:number):number =>{
  return x+y
}

//ts箭头 公式 变量名:类型 =赋值
let add3: (x:number,y:number) =>number //函数类型
add3=(x,y)=>x+y
add3=add2

/**
 * 02 默认参数 可选参数 ?
 */
function introducePerson(name: string,age: number=23,career?: string){
  console.log(`姓名 ${name} 年龄${age} 职业${career ? career: '无'}`)
}
introducePerson('tom',undefined,'cooker')

/**
 * 03 函数重载 :功能很类似 类型不同
 */
//法一:不重载反转实例,冗余
function reverseNumber(x:number):number{
  return Number(x.toString().split('').reverse().join(''))
}
function reverseString(x: string): string{
  return x.split('').reverse().join('')
}

//法二:联合类型      缺点:返回值提示类型比较模糊
function reverse_union(x:string|number):string|number|void{
  if (typeof x=== 'number') {
    return Number(x.toString().split('').reverse().join(''))
  }
  else if(typeof x=== 'string'){
    return x.split('').reverse().join('')
  }
}

//法三:函数重载
//写法: 前半部分写 函数声明, 最后一个函数是去实现它,并且要兼容之前的类型
function reverse(x:number):number
function reverse(x:string):string
function reverse(x:string|number):string|number|void{
  if (typeof x=== 'number') {
    return Number(x.toString().split('').reverse().join(''))
  }
  else if(typeof x=== 'string'){
    return x.split('').reverse().join('')
  }
}
reverse(123)

04.接口

/**
 * 01 对象接口-基本概念和用法
 * 02 可选属性 & 只读属性 & 任意属性
 * 03 用来描述函数的类型
 * 04 可索引接口
 */

/**
 * 01 对象接口-基本概念和用法
 */
//people
interface introducePerson {
  name:string,
  age:number,
  career:string,
  isNickLooking:boolean
}
const obj:introducePerson ={
  name: 'tom',
  age:23,
  career:'coder ',
  isNickLooking:true
}

/**
 * 02 可选属性 & 只读属性 & 任意属性
 */
interface introducePerson2 {
  readonly name:string,     //只读
  age:number,
  career?:string,           //可选: 可穿可不穿
  isNickLooking: boolean
}

const obj2:introducePerson2={
  name:'phdvb',
  age:35,
  isNickLooking:true
}

interface RandomIntroduce{
  name:string,
  age:number,
  //任意属性
  [propName: string]:string |number |undefined
}

const randomIntroduce: RandomIntroduce={
  name:'tom',
  age:23,
  like:'playgame',
  code:'good'
}

/**
 * 03 用来描述函数的类型
 */
interface ISum{
  (x:number ,y:number):number
}

const isum: ISum = (x,y) =>{
  return x+y
}

/**
 * 04 可索引接口
 */
interface RandomKeyArr{
  [propName: number]:String
}

const obj3:RandomKeyArr={
  0:'1',
  1:'123'
}
//或者
const obj31:RandomKeyArr = ['1','567']

05.类

/**
 * 01 基本写法
 * 02.继承
 * 03.多态
 * 04.抽象类
 * 05.this 类型
 */

// class
// 面向对象, 一类事物的抽象

/**
 * 01 基本写法
 */
class Animal{
  name:string
  constructor(name:string){
    this.name=name
  }
  eat(){}
  speak(){}
}
const p1=new Animal('tom')
p1.eat()

/**
 * 02.继承
 */
class Cat extends Animal{
  category:string 
  constructor(name:string,category:string){
    super(name)
    this.category=category
  }
}
const c2=new Cat('tom','加菲貓')
c2.eat()

/**
 * 03.多态
 */
class Dog extends Animal{
  speak(): void {
    console.log(this.name + '汪汪~~')
  }
  eat(): void {
    console.log('吃肉')
  }
}
class Cat2 extends Animal{
  speak(): void {
    console.log(this.name + '喵喵~~')
  }
  eat(): void {
    console.log('吃鱼')
  }
}

const dog1:Animal =new Dog('tom')
const cat1:Animal= new Cat2('jerry')

dog1.speak()
cat1.speak()

/**
 * 04 抽象类
 */
abstract class Animal2{
  name:string 
  constructor(name :string){
    this.name=name
  }
  abstract say():void
}

class Dog2 extends Animal2{
  say(): void {
    console.log('汪汪!')
  }
}

/**
 * 05 this  技巧:链式调用
 */
class Cook{
  step1(){
    console.log('烧水')
    return this
  }
  step2(){
    console.log('放调料')
    return this
  }
  step3(){
    console.log('加面条')
    return this
  }
}

const cook =new Cook()
//原始调用方法
// cook.step1()
// cook.step2()
// cook.step3()
cook.step1().step2().step3()

06.接口与类的调用

/**
 * 01. 类实现接口
 * 02. 接口继承接口
 */

/**
 * 01. 类实现接口(描述一类事物的行为)
 */
interface IWake{
  wakeUp():void
}
//类实现接口
class Alarm implements IWake{
  wakeUp():void{
  }
}

//抽象类 :类是单一继承的
//类可以实现多个接口
interface IMusic{
  playMusic():void
}

class Alarm2 implements IWake,IMusic{
  wakeUp():void{
  }
  playMusic(): void {
  }
}

/**
 * 02 接口继承接口
 * 好处:代码复用 ,接口可以随意组合
 */
interface ISmartAudio extends IWake,IMusic{
  controlSomethings():void
}
class Smart implements ISmartAudio{
  controlSomethings():void{
  }
  wakeUp(): void {
  }
  playMusic(): void {
  }
}

07.泛型

/**<T>
 * 01.引子
 * 02.泛型约束函数
 * 03.泛型约束类
 * 04.泛型约束接口
 * 05.小结
 */

/**
 * 01 引子
 */
//1.普通写法 麻烦
function print1(arg:string):string{
  console.log(arg)
  return arg
}
function print2(arg:number):number{
  console.log(arg)
  return arg
}
//02 联合类型 返回类型不精确
function print3(arg:number|string):number|string{
  console.log(arg)
  return arg
}
//03 重载
function print(arg:string):string
function print(arg:number):number
function print(arg:number|string):number|string{
  console.log(arg)
  return arg
}
//04 泛型(具体使用时确定类型),最开始可以用占位符,比如说T
function print_T<T>(arg:T){
  console.log(arg)
  return arg
}
print_T<number>(13)

/**
 * 02 泛型约束函数
 */
interface IPrint<T>{
  (arg: T):T
}
const p11:IPrint<number> =(arg) =>arg

/**
 * 03 泛型约束类
 */
class Stack<T>{
  private data:T[]=[]

  push(item:T){
    this.data.push
  }

  pop():T | undefined{
    return this.data.pop()
  }
}

const st01 =new Stack<string>()
st01.push('phdvb')

const st02 =new Stack<number>()
st02.push(63)

/**
 * 04 泛型约束接口
 */
interface ILength{
  length:number
}
function logLength<T extends ILength>(arg:T):T{
  console.log(arg.length)
  return arg
}
logLength('dasd')
logLength(['adas','3e2','dcasdqw'])

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值