TypeScript 基础(二)

TypeScript 类、继承与接口

  1. 类的介绍

    原生JavaScript使用函数和基于原型的继承来创建可重用的组件,真正的面向对象编程中的类到ES6才出现,而TypeScript直接允许程序员们使用基于类的面向对象编程,并且编译后的JavaScript可以在所有主流浏览器和平台上运行。

  2. 类的基本语法

    下面举一个使用类的例子:

    class Greeter {
        greeting: string;
        constructor(message: string) {
            this.greeting = message;
        }
        greet() {
            return "Hello, " + this.greeting;
        }
    }
    
    let greeter = new Greeter("world");
    

    这是一个简单的打印语句功能的类,语法与ES6极其相似,对于已经熟悉面向对象编程的人来说,上手很容易。

类的继承

与常用的面向对象模式相似,TypeScript也允许使用继承来扩展现有的类,一个简单的例子:

class Animal {
    move(distanceInMeters: number = 0) {
        // TypeScript中${...}表示字符串中加入变量
        console.log(`Animal moved ${distanceInMeters}m.`); 
    }
}

class Dog extends Animal {
    bark() {
        console.log('haha');
    }
}

const dog = new Dog();
dog.bark();	//haha
dog.move(10); //Animal moved 10m.
dog.bark(); //haha

一个稍微复杂的例子:

class Animal {
    name: string;
    constructor(theName: string) { 
        this.name = theName; 
    }
    move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

class Snake extends Animal {
    constructor(name: string) { 
        super(name); 
    }
    move(distanceInMeters = 5) {
        console.log("shuashua");
        super.move(distanceInMeters);
    }
}

class Horse extends Animal {
    constructor(name: string) { 
        super(name); 
    }
    move(distanceInMeters = 45) {
        console.log("derder");
        super.move(distanceInMeters);
    }
}

let sam = new Snake("蛇蛇");
let tom: Animal = new Horse("马马");

sam.move(); 
// shuashua...
// 蛇蛇 moved 5m.
tom.move(34);
// derder...
// 马马 moved 34m.

这个例子中,使用extends关键字创建了Animal的两个子类,但是两个子类中都包含了构造函数constructor,所以必须调用super()来执行基类的构造函数。而且,在构造函数里访问this属性之前,一定要调用super()。这是TypeScript强制执行的一条重要规则!

public(公有)、private(私有) 和protected(受保护)修饰符。
  1. 默认为公有public

    在上面的例子里,程序里定义的成员仿佛可以在外界自由访问,但是我们并没有定义public,因为在TypeScript中,成员都默认为public

    为了认识它,我们重写一遍上面的Animal

    class Animal {
        public name: string;
        public constructor(theName: string) { this.name = theName; }
        public move(distanceInMeters: number) {
            console.log(`${this.name} moved ${distanceInMeters}m.`);
        }
    }
    
  2. 私有private

    当成员被标记为private时,表示它是私有的,只能自己调用,不能被外界访问到。

    private私有方法允许继承,不暴露在外面,实例化对象不可调用

    比如:

    class Animal {
        private name: string;
        constructor(theName: string) { this.name = theName; }
    }
    
    new Animal("Cat").name; // 错误: 'name' 是私有的.
    
  3. 受保护protected

    protectedprivate类似,但是protected成员在继承它的所有子类中也都可以访问。

接口

在TypeScript中,核心原则之一是对值所具有的结构进行类型检查。在TypeScript里,接口的作用就是为这些类型命名,设置类的接口,可以有效地约束类必须使用设置的接口的所有方法和属性

接口内容只能是public

先来一个简单的案例对比一下接口如何工作:

原始代码如下:

function printLabel(labelledObj: { label: string }) {
  console.log(labelledObj.label);
}

let myObj = { size: 10, label: "Size 10 Object" };
printLabel(myObj);

用接口重写:必须包含一个label属性且类型为string:

interface LabelledValue {
  label: string;
}

function printLabel(labelledObj: LabelledValue) {
  console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

真正使用的过程中的一个简单的接口示例:

interface IDivMove{
    speed:number;
    createElement():HTMLElement;
    update():void;
}
interface IEventDispatch{
    dispatchs():void;
    addEvent(type:string,callBack:Function):void;
}

class HTMLElem implements IDivMove,IEventDispatch{
    public speed:number=1;
    public createElement():HTMLDivElement{
        let div = document.createElement("div");
        return div;
    }
    public update():void{
        
    }
    public dispatchs():void{
        
    }
    public addEvent():void{
        
    }
}
class HTMLElems implements IDivMove{
    public speed:number=1;
    public createElement():HTMLSpanElement{
        let span = document.createElement("span");
        return span;
    }
    public update():void{
        
    }
}

本篇文章介绍了TypeScript入门的一些皮毛,

有关类、继承和接口的知识点还有很多,详情可以参阅 官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: axios是一个常用的前端HTTP请求库,它提供了丰富的功能和易用的接口。为了更好地使用和管理axios,我们可以对其进行次封装,将其与TypeScript结合使用。 首先,我们需要创建一个名为axiosWrapper的文件,用于对axios进行封装。在文件中引入axios,并创建一个axios实例: ```typescript import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; const instance: AxiosInstance = axios.create({ baseURL: 'http://api.example.com', // 接口请求的基础URL timeout: 5000, // 超时时间 }); export default instance; ``` 通过以上代码,我们成功地创建了一个基于axios的实例,并设置了一些全局的请求配置,比如基础URL和超时时间。 接下来,我们可以在项目的其他地方引入axiosWrapper,并进行次封装,以适应项目的需要。例如,我们可以创建一个名为request的函数,用于发送HTTP请求: ```typescript import axiosWrapper from './axiosWrapper'; export function request<T>(config: AxiosRequestConfig): Promise<T> { return new Promise((resolve, reject) => { axiosWrapper(config) .then((response: AxiosResponse<T>) => { resolve(response.data); }) .catch((error: any) => { reject(error); }); }); } ``` 在以上代码中,我们将axiosWrapper作为基础请求函数,并返回一个Promise对象,以便在其他地方使用async/await进行异步处理。 通过这种次封装的方式,我们可以在项目中更方便地使用axios,并且可以根据项目的需要进行一些全局配置,比如设置统一的请求头、请求拦截器和响应拦截器等。同时,使用TypeScript还可以增加代码的可读性和可维护性,减少潜在的错误和调试时间。 总之,通过对axios进行次封装,并结合TypeScript的使用,可以提高代码的可重用性和可扩展性,为项目开发带来便利和效率。 ### 回答2: 在进行axios次封装时,使用TypeScript (ts) 可以为项目带来更好的类型安全以及代码的可维护性。在开始封装之前,需要先安装axios和typescript依赖。 首先,我们创建一个名为api.ts的文件,作为axios封装的入口文件。在该文件中,我们可以定义一个Axios实例,用来发送网络请求。这个实例可以添加拦截器、设置请求头等。 我们可以使用class来定义这个Axios实例,例如: ```typescript import axios, { AxiosRequestConfig, AxiosInstance } from 'axios'; class Api { private axiosInstance: AxiosInstance; constructor(config: AxiosRequestConfig) { this.axiosInstance = axios.create(config); this.initInterceptors(); } private initInterceptors() { // 添加请求拦截器 this.axiosInstance.interceptors.request.use((config) => { // 在发送请求之前做些什么 return config; }, (error) => { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 this.axiosInstance.interceptors.response.use((response) => { // 对响应数据做些什么 return response; }, (error) => { // 对响应错误做些什么 return Promise.reject(error); }); } // 在这里定义请求的方法 public get(url: string, params?: any) { return this.axiosInstance.get(url, { params }); } public post(url: string, data?: any) { return this.axiosInstance.post(url, data); } // 其他请求方法的定义... } export default Api; ``` 在上述代码中,我们首先引入了axios和AxiosRequestConfig以及AxiosInstance类型。然后创建了一个名为Api的class,用来封装我们的axios请求。 在class的constructor方法中,我们通过axios.create(config)创建了实际的axios实例,并通过initInterceptors()方法初始化了拦截器。 在initInterceptors()方法中,我们使用了axios提供的拦截器,可以在请求发起前做一些操作,以及在响应返回后对响应数据进行处理。 接下来我们可以在Api class中定义我们常用的请求方法,例如get和post方法。可以根据需要,继续封装其他的请求方法。 最后,我们通过export default将Api类导出,供其他地方使用。 通过以上的封装,我们可以在项目中引入Api类,并直接调用其中的方法来发起网络请求。同时,TypeScript的类型检查也能大大提高代码的可维护性和健壮性。 ### 回答3: axios是一种基于Promise的HTTP客户端库,它可以在浏览器和Node.js中发送异步请求。对于在使用TypeScript进行开发的项目中,可以通过次封装axios来更好地适应项目的需求。 首先,在进行 axios 的次封装之前,我们可以为 axios 创建一个实例,并设置一些默认的配置,例如设置基础的URL、headers等。这样可以减少代码的重复性,并保证请求都是在同样的配置下进行的。 其次,通过封装可以统一处理请求和响应的拦截操作。我们可以通过拦截器在请求发送之前和响应之后进行一些处理,例如在请求头添加Token,或者在响应后进行统一的错误处理。这样可以避免在每个请求中都重复写相同的代码,提高代码的复用性和可维护性。 此外,还可以针对项目中的特定需求来进行相应的封装。例如,可以封装处理不同类型请求的方法,如get、post等,或者封装处理不同业务模块的接口方法,如用户、订单等。这样可以更好地组织和管理项目中的请求代码,使其更加清晰和易于维护。 最后,可以使用Typescript对axios进行类型声明的补充,增强代码的可靠性和可读性。通过定义接口或类型来明确请求参数和响应数据的结构,可以避免一些常见的类型错误,并提供更好的代码提示和自动补全。 综上所述,通过对axios进行次封装,可以根据项目的需求进行灵活的定制和优化,提高代码的复用性、可维护性和可读性,同时结合Typescript的类型声明,使得请求代码更加健壮和可信赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值