TS 枚举、泛型、类、Partial和Required

1、枚举

枚举的作用很简单,就是用来列举数据,管理一系列数据的,让数据分类更加直观和可读,利于维护。

javascript 复制代码
enum Status {
    success = 200,
    fail = 500
}

let code:string|number = 200;
if( code === Status.success ) {
    console.log("成功")
} else if( code === Status.fail ) {
    console.log("成功")
}

另外若枚举对象没有值,它会自动按顺序赋值一个默认值,从 0 开始往后推。

javascript 复制代码
enum def {
     a, // 0
     b, // 1
}

2、泛型

泛型就是将类型也参数化,有时类型不明确,需要在用到时候才能指定,这时就可以使用泛型。

泛型用 T 代替,这个只是规范,用其他的字符代替也行,我们在调用函数时传入什么类型,T 就代表什么类型。

另外泛型也可以有多个, 同时泛型也可以有默认参数,例如下面的 G ,不传时则默认是number

javascript 复制代码
function foo<T,G = number>(n:T):void {
    console.log(n)
}

foo<string>("a");
foo<number,boolean>(1);
foo<string,boolean>('aaa');

类型别名也可以使用泛型,用法和函数的用法基本相同

javascript 复制代码
type objType<N,G> = { name:N , getName:()=>G };

let obj:objType<string,string> = {
    name:"lisi",
    getName(this:objType<string,string>){
        return this.name
    }
}
console.log( obj.getName() )

同理 接口也可以使用泛型,用法也是相同的:

javascript 复制代码
interface Person <N,G> {
    name:N;
    getName:()=>G;
}

let obj2:Person<string,string> = {
    name:"zhangsan",
    getName(){
        return "666"
    }
}

另外 我们可以使用 extends 来对泛型进行约束。

正常情况下的泛型随便传什么类型都可以,但有时我们可以需要约束它的类型。

javascript 复制代码
interface User< N extends string , G extends string|number > {
    name:N;
    gender:G;
}

let user1:User<string , number> = {
    name:"lisi",
    gender:1
}

User接口 便约束了泛型 N 必须为string , G 必须为 string 或者 number

3、类class

在 ts 中 定义了一个类之后,ts会帮我们自动生成一个和这个类同名的接口,这个接口会拥有这个类的所有的属性和方法。

在类中定义属性时。默认的修饰符就是public,即公共的,这些和java的理念非常类似。

private 私有的 只能通过get set 方法来进行获取和赋值,不能直接被获取,并且只有本类可以访问,子类不行。

protected 受保护的只有本类和 子类可以访问,类外面无法访问,和private比起来 权限更大一点。

javascript 复制代码
class User {
    public name:string;
    public age:number;
    private work = 'web';
    protected salary = 12000;
    constructor (name:string , age:number){
        this.name = name;
        this.age = age;
    }

    public getName():string{
        return this.name;
    }

    public getWork(){ return this.work; }

    setWork(work:string){ this.work = work }
}

let u = new User("zhangsan" , 18);
u.setWork("web程序员");
console.log( u )
console.log( u.getName() )

类的继承。

javascript 复制代码
class Male extends User {

    gender:string;

    constructor (n:string , age:number , gender:string){
        super(n,age);
        this.gender = gender;
    }
}

let m = new Male('lisi' , 20 , '男')
console.log( m )

这个很简单,需要注意的就是,可以在构造函数中 利用 super来调用父类的构造函数进行部分属性的初始化

抽象类 不是一种具体的类,它是用来对类进行规范的。

它本身不能实例化,只能被继承,需要继承后的类来实现它内部的抽象属性和抽象方法。

javascript 复制代码
abstract class Person {
    abstract name:string;
    abstract age:number;
    abstract getName():string;

    getAge(){
        return this.age;
    }
}

class per extends Person {
    name:string = "zhagnasn";
    age:number = 20;

    getName(){
        return this.name;
    }
}

let p1 = new per();
console.log( p1.getName() , p1.getAge() )

抽象类内部的抽象属性和抽象方法需要被继承的类来实现,但它内部的普通属性和方法则可以直接被继承使用。

接口 其实和抽象类是一样的,也是用来规范类的格式。

接口需要用 implements 关键字来进行实现。

javascript 复制代码
interface User {
    name:string;
    age:number;
    getName:()=>string;
}

class U implements User {
    name:string = "lisi";
    age:number = 20;

    getName(){ return this.name }
}

一个类继承了一个接口后,也必须将这个接口的所有属性和方法 实现 ,和抽象类性质也是一样的。

4、工具类 Partial 和 Required

Partial 工具类 的作用就是让我们可以自由的缺省掉接口中的某个属性,正常我们要缺省接口的某个属性必须使用 属性名?类型 的形式,但这种方式会改变原有接口,但有时我们需要临时让某个对象对接口属性进行缺省,这时就可以使用 Partial。

javascript 复制代码
interface User {
    name:string;
    age:number;
    gender?:number;
}

let user1:Partial<User> = {
    name:"lisi"
}

Required 也是ts 特地提供的一个工具类,它和 Partial 的作用正好相反,它是让接口的所有属性都变成不可缺省的例如某个接口它有个属性是可缺省的,但现在我突然临时需要它这些属性都不可缺省,但又不能改原有接口,这时就可以使用Required。

javascript 复制代码
interface User {
    name:string;
    age:number;
    gender?:number;
}

let user2:Required<User> = {
    name:"lisi",
    age:18,
    gender:1
}
相关推荐
好开心3311 分钟前
axios的使用
开发语言·前端·javascript·前端框架·html
百万蹄蹄向前冲2 小时前
2024不一样的VUE3期末考查
前端·javascript·程序员
alikami2 小时前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
wakangda3 小时前
React Native 集成原生Android功能
javascript·react native·react.js
吃杠碰小鸡3 小时前
lodash常用函数
前端·javascript
emoji1111113 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
一个处女座的程序猿O(∩_∩)O3 小时前
vue3 如何使用 mounted
前端·javascript·vue.js
User_undefined3 小时前
uniapp Native.js原生arr插件服务发送广播到uniapp页面中
android·javascript·uni-app
麦兜*3 小时前
轮播图带详情插件、uniApp插件
前端·javascript·uni-app·vue
陈大爷(有低保)3 小时前
uniapp小案例---趣味打字坤
前端·javascript·vue.js