成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

TypeScript 初識(shí) - 類(lèi)

鄒強(qiáng) / 915人閱讀

摘要:抽象類(lèi)抽象類(lèi)做為其它字類(lèi)的基類(lèi)使用,一般不會(huì)直接被實(shí)例化。抽象類(lèi)中可以包含具體實(shí)現(xiàn),接口不能。抽象類(lèi)在運(yùn)行時(shí)是可見(jiàn)的,可以通過(guò)判斷。接口只能描述類(lèi)的公共部分,不會(huì)檢查私有成員,而抽象類(lèi)沒(méi)有這樣的限制。

一個(gè)普通的類(lèi)
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter = new Greeter("world");
繼承

super 作為函數(shù)調(diào)用時(shí),代表父類(lèi)的構(gòu)造函數(shù)。子類(lèi)的構(gòu)造函數(shù)必須執(zhí)行一次 super 函數(shù),并且在構(gòu)造函數(shù)里訪(fǎng)問(wèn) this 的屬性之前一定要調(diào)用 super()

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("Slithering...");
        super.move(distanceInMeters);
    }
}

super 雖然代表了父類(lèi) Animal 的構(gòu)造函數(shù),但是返回的是子類(lèi) Snake 的實(shí)例,即 super 內(nèi)部的 this 指的是 Snake 的實(shí)例,因此 super() 在這里相當(dāng)于 Animal.prototype.constructor.call(this)

訪(fǎng)問(wèn)修飾符 public

在 TypeScript 中,所有訪(fǎng)問(wèn)修飾符默認(rèn)為 public,這個(gè)和 JavaScript 是一致的:

// 這和上面例子是一致的
class Animal {
    public name: string;
    public constructor(theName: string) {
        this.name = theName;
    }
    public move(distanceInMeters: number) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}
private

private 意為私有,使用 private 修飾的變量,不允許在類(lèi)的外面使用,子類(lèi)中也不允許訪(fǎng)問(wèn):

class Animal {
    private name: string;
    constructor(theName: string) {
        this.name = theName;
    }
}

new Animal("Cat").name; // Error

在 TypeScript 中,如果兩個(gè)類(lèi)的所有成員的類(lèi)型都是兼容的,這就表示兩個(gè)類(lèi)是兼容的。

但是,一個(gè)類(lèi)里有 private、protected 修飾的成員,另一個(gè)類(lèi)中的變量必須擁有來(lái)自同一處聲明相同修飾的變量,這兩個(gè)類(lèi)才算是兼容的:

class Animal {
    private name: string;
    constructor(theName: string) {
        this.name = theName;
    }
}

class Rhino extends Animal {
    constructor() {
        super("Rhino");
    }
}

class Employee {
    private name: string;
    constructor(theName: string) {
        this.name = theName;
    }
}

let animal = new Animal("Goat");
let rhino = new Rhino();
let employee = new Employee("Bob");

animal = rhino;
animal = employee; // 不能將類(lèi)型“Employee”分配給類(lèi)型“Animal”。類(lèi)型具有私有屬性“name”的多帶帶聲明。
protected

protected 唯一比 private 修飾的成員多出的權(quán)限在于,protected 修飾的成員可以在子類(lèi)中使用,但仍不允許在類(lèi)的外面使用。

構(gòu)造函數(shù)可以被 protected 修飾,修飾后的類(lèi)無(wú)法被實(shí)例化,只能被繼承。

readonly 修飾符

readonly 可以將屬性設(shè)置為只讀,只讀屬性只能在聲明時(shí)或者構(gòu)造函數(shù)里進(jìn)行初始化:

class Octopus {
    readonly name: string;
    readonly numberOfLegs: number = 8;
    constructor(theName: string) {
        this.name = theName;
    }
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // 錯(cuò)誤! name 是只讀的
參數(shù)屬性

參數(shù)屬性可以方便地在一個(gè)類(lèi)里定義并初始化一個(gè)成員:

// 這里和上面定義的類(lèi)是一樣的
class Octopus {
    readonly numberOfLegs: number = 8;
    // 把聲明和賦值合并到一起
    constructor(readonly name: string) {}
}

參數(shù)屬性通過(guò)給構(gòu)造函數(shù)參數(shù)前面添加一個(gè)訪(fǎng)問(wèn)限定符來(lái)聲明。使用 private 限定一個(gè)參數(shù)屬性會(huì)聲明并初始化一個(gè)私有成員;publicprotected 也是一樣。

存取器

TypeScript 中的類(lèi)支持取值函數(shù)(getter)、存值函數(shù)(setter):

let passCode = "secret passCode";

class Employee {
    // 私有屬性
    private _fullName: string;

    // getter
    get fullName(): string {
        return this._fullName;
    }

    // setter
    set fullName(newName: string) {
        if (passCode && passCode == "secret passCode") {
            this._fullName = newName;
        } else {
            console.log("Error: Unauthorized update of employee!");
        }
    }
}

let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
    alert(employee.fullName);
}

存取器必須要編譯器設(shè)置(compilerOptions.target)輸出為 ES6 或更高。

只帶有 get 不帶有 set 的存取器會(huì)自動(dòng)被推斷為 readonly

靜態(tài)屬性

TypeScript 中的類(lèi)支持靜態(tài)成員,可以在沒(méi)有實(shí)例化的情況下進(jìn)行訪(fǎng)問(wèn),使用 static 進(jìn)行修飾:

class Grid {
    static origin = { x: 0, y: 0 };
    calculateDistanceFromOrigin(point: { x: number; y: number }) {
        // 類(lèi)里使用靜態(tài)成員需要加上類(lèi)名,使用訪(fǎng)問(wèn)和 this 相同
        let xDist = point.x - Grid.origin.x;
        let yDist = point.y - Grid.origin.y;
        return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
    }
    constructor(public scale: number) {}
}

let grid = new Grid(1.0);

console.log(grid.calculateDistanceFromOrigin({ x: 10, y: 10 }));
// 14.142135623730951
console.log(Grid.origin);
// Object {x: 0, y: 0}

靜態(tài)方法調(diào)用不了實(shí)例化方法和實(shí)例化屬性,因?yàn)殪o態(tài)域加載是在解析階段,而實(shí)例化是在初始化階段,所以靜態(tài)方法里面不能調(diào)用本類(lèi)的方法和屬性,可以調(diào)用靜態(tài)屬性和靜態(tài)方法。

抽象類(lèi)

抽象類(lèi)做為其它字類(lèi)的基類(lèi)使用,一般不會(huì)直接被實(shí)例化。不同于接口,抽象類(lèi)可以包含成員的實(shí)現(xiàn)細(xì)節(jié)。abstract 關(guān)鍵字是用于定義抽象類(lèi)和在抽象類(lèi)內(nèi)部定義抽象方法:

abstract class Animal {
    abstract makeSound(): void;
    move(): void {
        console.log("moving...");
    }
}

抽象類(lèi)中的抽象方法不包含具體實(shí)現(xiàn)并且必須在字類(lèi)中實(shí)現(xiàn)。抽象方法必須包含 abstract 關(guān)鍵字并且可以包含訪(fǎng)問(wèn)修飾符。

類(lèi)和接口

類(lèi)定義會(huì)創(chuàng)建兩個(gè)東西:類(lèi)的實(shí)例類(lèi)型和一個(gè)構(gòu)造函數(shù)。因?yàn)轭?lèi)可以創(chuàng)建出類(lèi)型,所以可以在使用接口的地方使用類(lèi):

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = { x: 1, y: 2, z: 3 };

類(lèi)可以實(shí)現(xiàn)(implement)接口。通過(guò)接口可以強(qiáng)制指明類(lèi)遵守某個(gè)契約。也可以在接口中聲明一個(gè)方法,然后要求類(lèi)去具體實(shí)現(xiàn)它。

接口不可以被實(shí)例化,實(shí)現(xiàn)接口必須重寫(xiě)接口中的抽象方法。

類(lèi)可以實(shí)現(xiàn)(implement)多個(gè)接口,但只能擴(kuò)展(extends)自一個(gè)抽象類(lèi)。

抽象類(lèi)中可以包含具體實(shí)現(xiàn),接口不能。

抽象類(lèi)在運(yùn)行時(shí)是可見(jiàn)的,可以通過(guò) instanceof 判斷。接口則只在編譯時(shí)起作用。

接口只能描述類(lèi)的公共(public)部分,不會(huì)檢查私有成員,而抽象類(lèi)沒(méi)有這樣的限制。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106889.html

相關(guān)文章

  • TypeScript 初識(shí) - 接口

    摘要:接口的作用是聲明變量的結(jié)構(gòu)和方法,但不做具體的實(shí)現(xiàn)。這兩個(gè)使用場(chǎng)景不同。額外的屬性檢查從字面上的意思看,其實(shí)就是對(duì)接口未定義的屬性進(jìn)行檢查。上面的例子,定義了接口,它具有索引簽名。它不會(huì)幫你檢查類(lèi)是否具有某些私有成員。 接口的作用是聲明變量的結(jié)構(gòu)和方法,但不做具體的實(shí)現(xiàn)。通常,接口會(huì)強(qiáng)制對(duì)所有成員進(jìn)行類(lèi)型檢查,包括數(shù)量和類(lèi)型: interface Name { first: s...

    gnehc 評(píng)論0 收藏0
  • 那些年初識(shí)Angular(1)

    摘要:它包含多個(gè)屬性,這些屬性值叫做元數(shù)據(jù)。會(huì)根據(jù)元數(shù)據(jù)渲染組件,并執(zhí)行組件邏輯。元數(shù)據(jù)會(huì)告訴圖和將這個(gè)類(lèi)處理成一個(gè)組件。元數(shù)據(jù)這段代碼表示這個(gè)組件可以通過(guò)這個(gè)標(biāo)簽來(lái)調(diào)用。 那些年初識(shí)Angular 由于工作需要初識(shí)了Angular,由于個(gè)人在學(xué)習(xí)一門(mén)新語(yǔ)言的時(shí)候喜歡買(mǎi)一本相關(guān)的書(shū)籍自己鉆研,還記得自己的第一本Angular書(shū)籍是關(guān)于Angular2的學(xué)習(xí),自此正式踏入Angular的學(xué)習(xí)。...

    Flink_China 評(píng)論0 收藏0
  • TypeScript 初識(shí) - 高級(jí)類(lèi)

    摘要:聯(lián)合類(lèi)型聯(lián)合類(lèi)型表示一個(gè)值可以時(shí)集中類(lèi)型之一,使用進(jìn)行分隔每種類(lèi)行。聯(lián)合類(lèi)型的變量在被賦值的時(shí)候,根據(jù)類(lèi)型推論的規(guī)則,推斷出一個(gè)類(lèi)型。 聯(lián)合類(lèi)型 聯(lián)合類(lèi)型表示一個(gè)值可以時(shí)集中類(lèi)型之一,使用 | 進(jìn)行分隔每種類(lèi)行。 聯(lián)合類(lèi)型的變量在被賦值的時(shí)候,根據(jù)類(lèi)型推論的規(guī)則,推斷出一個(gè)類(lèi)型。 聯(lián)合類(lèi)型的變量當(dāng)被推斷出類(lèi)型后,就變得和正常聲明的變量一樣: let ddd: string | numb...

    CatalpaFlat 評(píng)論0 收藏0
  • TypeScript 初識(shí)

    摘要:當(dāng)你陷在一個(gè)中大型項(xiàng)目中時(shí)應(yīng)用日趨成為常態(tài),沒(méi)有類(lèi)型約束類(lèi)型推斷,總有種牽一發(fā)而動(dòng)全身的危機(jī)和束縛??傮w而言,這些付出相對(duì)于代碼的健壯性和可維護(hù)性,都是值得的。目前主流的都為的開(kāi)發(fā)提供了良好的支持,比如和。參考資料中文文檔 文章博客地址:http://pinggod.com/2016/Typescript/ TypeScript 是 JavaScript 的超集,為 JavaScrip...

    iliyaku 評(píng)論0 收藏0
  • TypeScript 初識(shí) - 內(nèi)置對(duì)象

    摘要:自帶的內(nèi)置對(duì)象都可以直接在中當(dāng)作定義好的類(lèi)型。的內(nèi)置對(duì)象標(biāo)準(zhǔn)提供了常用的內(nèi)置對(duì)象等。在不需要額外引入就可以直接使用這些內(nèi)置對(duì)象用寫(xiě)不是內(nèi)置對(duì)象的一部分,想要寫(xiě)時(shí)提示,需要引入第三方聲明文件 JavaScript 自帶的內(nèi)置對(duì)象都可以直接在 TypeScript 中當(dāng)作定義好的類(lèi)型。 TypeScript 核心庫(kù)的定義文件 TypeScript 核心庫(kù)的定義文件定義了所有瀏覽器環(huán)境需要用...

    lordharrd 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<