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
}
相关推荐
小曲曲3 分钟前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•1 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS2 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
yqcoder6 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
会发光的猪。7 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js