typeScript简单入门

ts不能赋值为原来已有的数据类型为其它数据类型。

1、ts类型转换
  • 首先使用在项目中使用ts是需要配置的,具体怎么配置这里不做讲解。
2、live serve插件,能实时刷新本地文件修改,并自动刷新浏览器。
3、TS中基本数据类型:
  • number数值类型,let num=5;等同于let num:number=5;
  • boolean 布尔类型,let isLogin=false;等同于let isLogin:boolean=false。
  • string字符串,let name=“hello”;等同于let name:string=‘helllo’。
  • any任何类型,初始化的时候不指定任何值,即是初始一个任何类型的数据,例如:
    let anything;
    anything=25;
    anything='hello';
    

    上述的写法是不会报错的。

    类似于:let anything:any。尽量不使用any类型。

  • 数组,let names:Array=[‘xiaoming’,‘zhangsan’]。格式为数据类型,以及数组中数据类型为字符串。修改数组值:names[0]=‘liubei’,names=[‘zhang’]。

    number数组声明:

    let age:Array<number>=[1,6,89];
    // 或者简写
    let age: number[]=[1,6,68];
    // 声明一个任何类型的数组
    let anyArray:any[]=['hello'12false];
    
  • 元组

    元组是用来存放多种类型的值。它和数组中any类型区别是元组更加严谨,当知道数组每个位置数据类型的时候,建议使用元组来存放数据。

    // 注意数据类型顺序不可以改变
    let colors:[string, number]=['red', 9393];
    
  • 枚举

    枚举的定义是使用enum关键字来声明的。 一个枚举可以包含零个或多个枚举成员,枚举成员具有一个数字值,它可以是常数或计算得出的值。

    enum color{
        Black,
        number=100,
        string,
    }
    console.log(color.Black, color.number,color.string); // 输出结果为0,100, 101
    // 也即是默认为0,1,2。当做出修改的时候会跟随着改变。
    
  • 函数类型
function returnValue(){
	return 'hello';
}
// 如果需要对函数返回值的类型做一个限定,可以使用
function returnValue():string{
	return 'hello';
}
// 函数无任何返回值,无参数
function hello(): void{
    console.log(123);
}
// 参数类型限定
function hellos(value1:number, value2:number):number{
    return value1+value2;
    console.log(value1+value2);
}
// 函数类型
这里规定变量myFuhnc存储的函数只能是有两个参数,并且两个参数都是number,并且返回值为number
let myFunc:(a:number, b:number)=>number
myFunc=hellos;
myFUnc(2,3); // 5
  • 对象类型和type
// 限定对象参数名称和类型
let dataObj:{name: string, age: number}={
    name: 'ling',
    age: 2,
  }
// 修改时必须名称一致,属性值类型一致
dataObj={
    name: 'lings',
    age: 9,
  }

// 复杂对象
function myFunction(value1: number, value2: number):number[]{
    return [value1, value2];
  }
let dataObj:{age: number[], myFunc: (a: number, b: number)=>number[]}={
    age: [12, 89],
    myFunc: myFunction,
  }
// 对于上述类型限定比较长,可以先定义好类型再使用
type MyType={age: number[], myFunc: (a: number, b: number)=>number[]};
let dataObj:MyType={
    age: [12, 89],
    myFunc: myFunction,
  }
  • union type(或)
let unionType: string | number | Boolean=2;
unionType='hello';
unionType=true;
  • 类型检查
let checkType=18;
if(typeof checkType==="number" ){
    console.log('数值');
}
  • null和undefined
  • never,never类型是任何类型的子类型,也可以赋值给任何类型,但是,不能将其它类型转为never类型。
let x:never=123;
x=2; // 不允许,因为2是数值类型,不允许赋值给never类型。

never应用场景就是抛出异常和死循环

// 抛出异常
function err(message: string):never{
   throw new Error(message);
}
// 死循环
function loop():never{
    while(true){
        console.log('123');
    }
}
// 将never类型赋值给其它类型是不会报错的
let x:number=2;
x=err('错误');
console.log(x);
4、面向对象
4.1、类
// 属性前边不加限制默认使用public,不仅能在类里边使用也能在外边使用。还有protected(被保护的),只能在类里边使用或者子类里边获取,在外边获取不到。private(私有的)只能在类自己里边获取,在子类和外部均得不到。
class Parents{
    name: string;
    protected age: number;
    constructor(name: string, age: number,public userName: string){
      this.name=name;
      this.age=age;
      this.userName=userName;
    };
    printAge(){
      console.log(this.age);
    }
  }
  const person=new Parents('liu', 12, 'liufei');
  console.log(person.name, person.userName);
  person.printAge();
4.2、类的继承
class Child extends Parents{
    public studentId: number;
    constructor(name: string, age: number, userName: string, studentId: number){
      super(name, age, userName);
      this.studentId=studentId;
    };
  }
  const childens=new Child('领', 16, '林哥', 202007080001);
  console.log(childens.name, childens.studentId, childens);
4.3、给私有属性设置值set或获取值get
class User{
    private _name: string;
    set setName(name: string){
      this._name=name;
    }
    get getName(){
      return this._name;
    }
    constructor(name: string){
      this._name=name;
    };
  }
  const users=new User("领");
  console.log(users.getName);// 领
  users.setName="你好更改";
  console.log(users.getName); // 你好更改
4.4、静态属性和静态方法

所谓静态属性和静态方法,就是不用实例化就能够获取到的属性和方法,前边加static

class User{
    static height :number=900;
    static getHeight(height: string): string{
      return height;
    }
  }
  console.log(User.height, User.getHeight('900px'))
4.5、命名空间namespace

用关键字namespace来声明命令空间,外边要想使用,必须使用export抛出去。

namespace MyMath{
    export const name:string='加油';
    export function getName(name:string):string{
      return name;
    }
  }
  const names=MyMath.name;
  console.log(names, MyMath.getName("今朝"));
4.6、模块

导出export

引入import

5、接口
5.1、类型使用interface关键字来声明,对属性进行类型的限定,类似于type,但是和type使用有些区别。

​ ① 其中不加?是必须传的,加了?可以传,也可以不传。

​ ② readonly是只读的不允许修改。

​ ③ [propName:string]任何名字,并且可传可不传,随便起名字。

​ ④ 方法定义方法名+():返回值

interface Person{
    name: string;
    age?: number;
    readonly desc: string,
    [propName: string]: any;
    greet(): void;
  }
  const everyOne: Person={
    name: '领',
    age: 16,
    desc: '性格直爽',
    random: [123],
    greet(){
      console.log(this.random);
    }
  }
  everyOne.greet();
  console.log(everyOne);
5.2、interface和type区别

​ interface和type区别是: interface能被继承,type不能被继承。在类里边尽量使用interface,在非类里边两者都可以使用。

5.3接口继承及类的实现

使用关键字implements来实现接口,一个类可以实现多个接口

① 例如一个类实现一个接口可以使用

interface Person{
    name: string;
    age?: number;
    readonly desc: string,
    [propName: string]: any;
    greet(): void;
  }
  class People implements Person{
    name: string; // 没有初始值,需要使用构造器,从外部传入
    desc: string='加速度';
    greet(){console.log(1)};
    constructor(name: string){
      this.name=name;
    };
  }
  const everyOne=new People('小明');
  console.log(everyOne);

② 一个类实现多个接口,中间用逗号隔开

interface Person{
    name: string;
    age?: number;
    readonly desc: string,
    [propName: string]: any;
    greet(): void;
  }
  interface Status{
    id: number;
  }
  class People implements Person, Status{
    name: string='华哥';
    desc: string='加速度';
    id: number=12345;
    greet(){console.log(1)};
  }
  const everyOne=new People();
  console.log(everyOne);

③ 接口继承 使用extends关键字

interface Status{
    id: number;
  }
  interface People extends Status{
    work: string;
  }
  const workShop: People={
    id: 1123,
    work: '前端开发',
  }
  console.log(workShop);
6、typeScript泛型Generic
6.1、什么时候使用泛型?

答: 当我们调用一个函数的时候,不想立即声明函数参数类型,以及函数返回值类型。而是等到我们调用接口的时候才确定传递的参数类型,此时可以使用泛型,泛型的定义就是<>,假如定义一个T的泛型。当调用的时候传递类型会根据你传递的进行处理,如果,不想传递类型,交给ts自己去推断也是可以的。

function getName<T>(name: T): T{
    return name;
  }
  console.log(getName<string>('领哥'));
  console.log(getName(true));
  console.log(getName(123));

也可以在接方法中使用泛型

interface Person{
    <T>(name: T):T;
  }
  function getName<T>(name: T): T{
    return name;
  }
  const people:Person=getName;
  console.log(people('ling'))
  console.log(people<string>('领哥'));
  console.log(people(true));
  console.log(people(123));

也可以将泛型提升到接口层面

interface Person<T>{
    (name: T):T;
  }
  function getName<T>(name: T): T{
    return name;
  }
  const people:Person<string | number>=getName;
  console.log(people('ling'));
  console.log(people(123));
6.2、给泛型约束

假如限定泛型中传入的参数必须有height属性,可以写成如下写法:

function getHeight<T extends {height: any}>(obj: T): T{
    return obj.height;
  };
  const Obj={
    height: 180,
    age: 20,
    name: 'ling',
  }
  console.log(getHeight(Obj));

或者给泛型限定类型

function getHeight<T extends number>(obj: T): T{
    return obj;
  };
  const Obj=180
  console.log(getHeight(Obj));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值