typeScript

137 阅读2分钟

TypeScript 是 JavaScript 的一个超集,主要提供了类型系统对 ES6 的支持。

描述

本文主要记录零散知识点

忽列基本类型   

零基础想了解更多上官网——TypeScript

元组 (Tuple)

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为stringnumber类型的元组。

let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error

1.设置值
x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
x[6] = true; // Error, 布尔不是(string | number)类型

2.取值
console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'

枚举(enum)

没有初始值从下标0开始 ,有初始值从初始值开始,中间隔断就是undefined

enum f {
  faile,  
  success=2,
  wait='minute'
  error
}
console.log(f.success) //2
console.log(f.faile)  //0
console.log(f.wait)  //minute
console.log(f.error)//undefined

let e:f=f.success

console.log(e)  //2

接口(interface)

定义类型变量实现共用

//1.定义变量接口
interface info {
  name:string
  age?:number    //age? 表示可传可不传
}function userInfo(user:info){
    console.log(`name:${user.name} == age:${user.age}`)
}

let obj={
    name:'xiaoqi',
    age:18
}
userInfo(obj)

//2.定义函数接口
interface encrypt {
    (key:string,val:string):string
}
let md5:encrypt=function (key:string,val:string):string {
    return key+val
}
let shark:encrypt=function (key:string,val:string):string {
    return key+val
}
console.log(md5('xiaoqi','yanjiusuo'))
console.log(shark('xiaoqi','yanjiusuo'))

//3.定义类接口
interface props {
    name:string
    age:number
    eat(val:string):void    
}

interface person extends props{
    work(val:string):void
}

class Dog implements props{
    name:string;
    age:number
   constructor(name:string,age:number){
      this.name=name
      this.age=age
   }
    eat(val:string): void {
       console.log(val)
    }
}
let dog=new Dog('xiaohei',18)
dog.eat('dami');
console.log(dog);

//扩展 类继承
class Cat extends Dog implements person{
    constructor(name:string,age:number){
        super(name,age)
    }
    eat(val: string): void {
        super.eat(val);
    }

    work(val: string): void {
        console.log(val)
    }
}

let cat = new Cat('xiaobai',15)
cat.work('zhuolaoshu');  //zhuolaoshu
cat.eat('xiaohei');  //xiaohei
console.log(cat);  //Cat {name: "xiaobai", age: 15}

泛型

类型由调用者来定义

 class CompMini<T>{         //实现传入不同类型值 获取最小值的案例
   public list:T[]=[];
   add(val:T):void{
      this.list.push(val)
   }
   mini():T{
       let count=this.list[0]
       for(let i=0;i<this.list.length;i++){
           if(count>this.list[i]){
               count=this.list[i]
           }
      }
       return count
   }
 }

 let compMIni=new CompMini<number>()
 compMIni.add(2)
 compMIni.add(6)
 console.log(compMIni.mini());  //2

 compMIni.add('b')
 compMIni.add('a')
 console.log(compMIni.mini());  //a

//定义接口函数泛型
//<1>
interface info {
    <T>(val:T):T
}

let user:info=function <T>(val:T):T {
    return val
}

console.log(user<string>('kkk'))

//<2>
interface userInfo<T>{
    (val:T):T
}

function user2<T>(val:T):T {
    return val
}
let users:userInfo<string>=user2

//定义泛类
class UserInfo<T>{
    add(val:T):Boolean{
        console.log(val)
        return true
    }
}

class Student{
    name: string | undefined
    age?: number | undefined
    constructor(
        name: string | undefined,
        age?: number | undefined,
    ){
        this.name=name
        this.age=age
    }
}

let student=new Student('ss',45)
let user=new UserInfo<Student>()    //泛指student类user.add(student)

命名空间

解决页面变量污染

 namespace A{
     export function fn():any {
         console.log(55)
     }
 }
 namespace B{
     export function fn():any {
         console.log(55)
     }
 }
 A.fn() 
 B.fn()

//模块使用export namespace A{
     export function fn():any {
         console.log(55)
     }
 }

import {A} from 'xxx'
 A.fn()

装饰器

比如,有如下列表:

//(1)  普通
function logClass(targer:any):any {
    // console.log(targer)
    targer.prototype.yy='xiaoqi'
}

//(2)  工厂
function logClass2(parmas:any):any {     // 1.有传值 parmas   没有就是target
    return function(target:any){
        target.prototype.user='sig'
        // console.log(parmas);
    }

}

//(3) 继承
function logClassExtend(target:any):any {
    return class extends target{
        name='sigrol'
    }
}

//(4) 属性
function datas(parmas:any):any {
    return function(target:any,attr:any,val:any){
        console.log(target);  //{getData: ƒ, constructor: ƒ}
        console.log(attr);    //getData
        console.log(val);    //getData
        console.log(parmas);  //pp
        console.log(target[attr]);  //fn
    }
}

@logClass
@logClassExtend
@logClass2('kkk')
class HttpClient{
    public name:string
    constructor(name:string){
      this.name=name
    }
    @datas('ppp')
    getData(val:string):void{
      console.log(this.name)  //sigrol
      // console.log(val)  //99
    }
}

var cc:any=new HttpClient('xiaoqiyanjiusuo')
    console.log(cc.yy);   //xiaoqi
    console.log(cc.user);   //sig
    cc.getData('99');

enum f {faile,success=2,aa='jjjj',error}
console.log(f.success) //2
console.log(f.faile)  //0
console.log(f.error)//3
console.log(f.aa)//3