(TypeScript篇)二.基礎

1.類Class

概念:定義了一切事物的抽象特點

對象:類的實例

面向對象三大特性:封裝繼承多態

1)構建動物類

class Animal{

   name: string;

   static categories: string[] = ['mamba', 'google'];

   // 構造器

    constructor(name: string){

        this.name = name;

    }

    // 靜態方法

    static isAnimal(a){

        return a instanceof Animal

    }

    // 方法

    run(){

        return `${this.name} is running`

    }

}

// 實例化

const snake = new Animal('snake');

console.log(snake.run()); // 對象點方法

console.log('靜態屬性',Animal.categories); // 類名點屬性名

2)構建其繼承

class Dog extends Animal{  // 繼承

    bark(){  // 繼承之後增加的方法

        return `${this.name} is barking`;

    }

}

const xiaohuang = new Dog('xiaohuang');// 實例化對象小黃

console.log(xiaohuang.run());

console.log(xiaohuang.bark());

 

3)繼承之後實現方法的重寫

class Cat extends Animal{

    constructor(name){

       super(name);

    }

    run(){  // 重寫run方法

        return 'Mamba,' + super.run();

    }

}

const maomao = new Cat('maomao');  // 實例化Cat類爲maomao

console.log(maomao.run());

 

4)修飾符public private protected

說明:private 設置屬性或方法只能自己類中訪問,其子類也不行

protected其子類可以訪問

public 公開

 

2.接口interface

對對象的形狀(shape)進行描述

對類(class)進行抽象

Duck Typing鴨子類型

 

1)定義接口用類來實現

interface Radio{

    switchRadio(): void;

}

interface Battery{

    checkBatteryStatus(): void;

}

// 類實現

class Car implements Radio{

    switchRadio(){

       console.log(123);

    }

}

// 多實現

class Cellphone implements Radio, Battery{

    switchRadio(){

       console.log(123);

    }

    checkBatteryStatus(){

        console.log(54555);

    }

}

 

2)設置接口屬性

interface Person{

    readonly id: number;  // 只讀屬性,定義時候賦值,不能修改

    name: string;

    age?: number;   // ?表示可選屬性

}

// 常規屬性必須添加,可選屬性沒必要添加,只讀屬性必須定義時候賦值

let mamba: Person = {

    id: 1,

    name: 'mamba',

    age: 20

}

// mamba.id = 2; 報錯,只讀屬性不能修改

// const 定義常量 readonly 用在屬性上

// const a:number = 2; 

// a = 3; // 這裏會報錯

 

3.枚舉enum

enum Direction{

    Up = 'UP';

    Down = 'DOWN';

    Left = 'LEFT';

    Right = 'RIGHT';

}

const value = 'UP';

if(value === Direction.Up){

    console.log('go up!');

}

console.log(Direction.Up);

 

4.泛型

說明:泛型是指在定義函數 接口或類的時候,不預先指定具體的類型,而在使用的時候再指定類型的一種特性。

1)定義格式

function echo<T>(arg: T): T{

    return arg;

}

// 會發生類型推論

// 給你定義const result:string

// 根據傳遞的值可以得出如:數字number就會變成number類型

const result = echo('mamba');

 

2)定義多個參數,元組

function swap<T, U>(tuple:[T, U]): [U, T]{

    return [tuple[1], tuple[0]];

}

const result2 = swap(['string', 123]); // 類型推論,T是string類型 U是number類型

console.log(result2[0]);

function echoWithArr<T>(arg: T[]): T[]{

    console.log(arg.length);

    return arg;

}

const arr2 = echoWithArr([1, 2, 3]);  // 類型推論,是個number類型的數組

 

3)約束泛型

// 說明:約束有length這個屬性

interface IWithLength{

    length: number

}

function echoWithLength<T extends IWithLength>(arg: T): T{

    console.log(arg.length);

    return arg;

}

const str = echoWithLength('str');

const obj = echoWithLength({length: 10});

const arr2 = echoWithLength([1, 2, 3]);

console.log('##################');

 

4)定義類的泛型

class Queue<T>{

    private data = [];

    push(item: T){

        return this.data.push(item);

    }

    pop(): T{

        return this.data.shift();

    }

}

const queue = new Queue<number>();

queue.push(1);

console.log(queue.pop().toFixed());

 

const queue2 = new Queue<string>();

queue2.push('str');

console.log(queue2.pop().length);

 

5)接口泛型

interface KeyPair<T, U>{

    key: T;

    value: U;

}

let kp1: KeyPair<number, string> = {key: 123, value: 'str'};

let kp2: KeyPair<string, number> = {key: 'str', value: 456};

 

let arr: number[] = [1, 2, 3];

// 泛型

let arrTwo: Array<number> = [1, 2, 3];

 

// 定義接口

interface IPlus<T>{

   (a: T, b: T): T

}

function plus(a: number, b: number): number{

    return a + b;

}

function connect(a: string, b: string): string{

    return a + b;

}

const a: IPlus<number> = plus;

const b: IPlus<string> = connect;

 

5.類型別名

type PlusType = (x: number, y: number) => number;

function sum(x: number, y: number): number{

    return x + y;

}

const sum2: PlusType = sum;

 

type NameResolver = () => string;

type NameOrResolver = string | NameResolver;

function getName(n: NameOrResolver): string{

    if(typeof n === 'string'){

        return n;

    }else{

        return n();

    }

}

 

6.類型斷言 

說明:斷言必須存在一種類型

function getLength(input: string | number): number{

    const str = input as String;

    if(str.length){

        return str.length;

    }else{

        const number = input as Number;

        return number.toString().length;

    }

    // 另外一種寫法

    if((<String>input).length){

        return (<string>input).length;

    }else{

       return input.toString().length;

    }

}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章