日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
typescript中的class和interface

 typescript這個東西說實(shí)在的,真的是容易忘記,一段時間不用就感覺特別陌生,但是回過頭來看看,又有一種熟悉的感覺,有句話這么說的ts越用越香,它確實(shí)能夠規(guī)范我們的書寫的格式,語法校驗和類型校驗等。之前寫過react+ts的一個demo,但是時間久了就忘記了,現(xiàn)在也是趁著熱度再回顧一下ts的內(nèi)容,以及一些高階語法,現(xiàn)在我們回顧一下ts中常見的類和接口,如果喜歡的可以點(diǎn)贊,評論,關(guān)注公眾號讓更多的人看到。如果有問題也可以評論留言,我們一起相互學(xué)習(xí),一起進(jìn)步。

泊頭網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

class
首頁我們要清楚的一點(diǎn)是typescript中類和javascript中ES6語法類的區(qū)別,千萬不要混淆。ts中相比于js添加了聲明屬性的類型和參數(shù)的類型以及返回結(jié)果類型。這個地方一看就會一寫就不對,如果不聲明ts會報錯。

 
 
 
 
  1. class Person{ 
  2.     name:string; 
  3.     constructor(name:string){ 
  4.         this.name = name; 
  5.     } 
  6.     getName():void{ 
  7.         console.log(this.name); 
  8.     } 

 
 
 
 
  1. class Person{ 
  2.     constructor(name){ 
  3.         this.name = name; 
  4.     } 
  5.     getName(){ 
  6.         console.log(this.name); 
  7.     } 

ES5編輯后的結(jié)果

 
 
 
 
  1. var Person = /** @class */ (function () { 
  2.     function Person(name) { 
  3.         this.name = name; 
  4.     } 
  5.     Person.prototype.getName = function () { 
  6.         console.log(this.name); 
  7.     }; 
  8.     return Person; 
  9. }()); 

類的get和set
ts在編譯get和set的時候默認(rèn)是es3編譯,vscode編輯器會報錯error TS1056: Accessors are only available when targeting ECMAScript 5 and higher需要編譯到版本ES5或以上,解決辦法:$ tsc xxx.ts -t es5。

 
 
 
 
  1. class User{ 
  2.     myname:string; 
  3.     constructor(myname:string){ 
  4.         this.myname = myname 
  5.     } 
  6.     get name(){ 
  7.         return this.myname 
  8.     } 
  9.     set name(newName:string){ 
  10.         this.myname = newName 
  11.     } 

ES5編譯后的結(jié)果

 
 
 
 
  1. var User = /** @class */ (function () { 
  2.     function User(myname) { 
  3.         this.myname = myname; 
  4.     } 
  5.     Object.defineProperty(User.prototype, "name", { 
  6.         get: function () { 
  7.             return this.myname; 
  8.         }, 
  9.         set: function (newName) { 
  10.             this.myname = newName; 
  11.         }, 
  12.         enumerable: false, 
  13.         configurable: true 
  14.     }); 
  15.     return User; 
  16. }()); 

這里有幾個思考問題,答案見文末:

 
 
 
 
  1. var u = new User("a"); 
  2. console.log(u); 
  3. console.log(u.myname); 
  4. u.myname = 'b'; 
  5. console.log(u.myname); 
  6. console.log(u.hasOwnProperty("name")); 
  7. console.log(Object.getPrototypeOf(u)); 
  8. console.log(Object.getPrototypeOf(u).hasOwnProperty("name")); 

抽象類
abstract關(guān)鍵字表示抽象類,抽象類是不能被實(shí)例化即new,只能被繼承,抽象類一般是用來封裝一些公共的,提供給子類使用的方法和屬性的

 
 
 
 
  1. abstract class Animal{ 
  2.     public readonly name:string; 
  3.     protected age:number = 38; 
  4.     private money:number = 10; 
  5.     constructor(name:string){ 
  6.         this.name = name 
  7.     } 
  8. class Dog extends Animal{ 
  9.     static className = 'Dog' 
  10.     static getClassName(){ 
  11.         console.log(this.className) 
  12.     } 
  13.     getName(){ 
  14.         console.log(this.name) 
  15.     } 
  16.     getAge(){ 
  17.         console.log(this.age) 
  18.     } 
  19. let a = new Animal("ss"); 

這里打印看一下繼承的結(jié)果:

 
 
 
 
  1. console.log(a); //Dog { age: 38, money: 10, name: 'ss' } 

這里順便說一下訪問修飾符 public protected private

public 里里外外都能訪問,包括自己、自己的子類、其他類都能
protected 自己和子類能訪問但是其他地方不能訪問
private 私有的(只有自己能訪問,子類的其他都不能訪問)

接口表示對象的屬性

 
 
 
 
  1. interface Rectangle { 
  2.     width: number; 
  3.     height: number 
  4.  
  5. let r: Rectangle = { 
  6.     width: 100, height: 10 
  7.  
  8. interface Speakable { 
  9.     speak(): void; 
  10.     name?: string 
  11.  
  12. let speaker: Speakable = { 
  13.     //name:"bdt", 
  14.     speak() { } 

接口用來描述抽象的行為

 
 
 
 
  1. interface AnimalLink { 
  2.     eat(): void; 
  3.     move(): void 

接口可以實(shí)現(xiàn)繼承

 
 
 
 
  1. interface PersonLike extends AnimalLink { 
  2.     speak(): void 
  3. class Person2 implements PersonLike { 
  4.     speak() { }; 
  5.     eat() { }; 
  6.     move() { } 

通過接口約束變量類型

 
 
 
 
  1. interface Person3 { 
  2.     readonly id: number; 
  3.     name: string; 
  4.     [PropName: string]: any 
  5. let p1: Person3 = { 
  6.     id: 1, 
  7.     name: "sss" 

通過接口約束(規(guī)范)函數(shù)

 
 
 
 
  1. interface DiscountInterface{ 
  2.     (price:number):number 
  3. let discount:DiscountInterface = function (price: number): number { 
  4.     return price * .8 

通過索引約束數(shù)組和對象

 
 
 
 
  1. interface UserInterface{ 
  2.     [index:number]:string 
  3.  
  4. let arr:UserInterface = ['aa','bb'] 
  5.  
  6. interface UserInterface2{ 
  7.     [index:string]:string 
  8. let obj:UserInterface2  = {name:"sss"} 

通過接口約束構(gòu)造函數(shù)

 
 
 
 
  1. class Animal3{ 
  2.     constructor(public name:string){} 
  3. interface WithClassName{ 
  4.     new (name:string):Animal3 
  5. function createClass(clazz:WithClassName,name:string){ 
  6.     return new clazz(name) 
  7. let a3 = createClass(Animal3,"別抖腿"); 
  8. console.log(a3) 

class和interface的區(qū)別
class 類聲明并實(shí)現(xiàn)方法
interface 接口聲明,但是不能實(shí)現(xiàn)方法

 
 
 
 
  1. abstract class Animal{ 
  2.     name:string="111"; 
  3.     abstract speak():void;  //抽象類和方法不包含具體實(shí)現(xiàn)  必須在子類中實(shí)現(xiàn) 
  4. //接口里的方法都是抽象的 
  5. interface Flying{ 
  6.     fly():void 
  7. interface Eating{ 
  8.     eat():void 
  9. class Dog extends Animal{ 
  10.     speak(){ 
  11.         console.log("汪汪汪")   //重寫:子類重寫繼承自父類中的方法 
  12.     } 
  13. class Cat extends Animal implements Flying,Eating{ 
  14.     speak(){   //繼承抽象類的方法必須實(shí)現(xiàn) 
  15.         console.log("喵喵喵") 
  16.     } 
  17.     fly(){ 
  18.         console.log("我是一只飛貨") 
  19.     } 
  20.     eat(){ 
  21.         console.log("我是一只吃貨") 
  22.     } 

寫在最后
文中答案

 
 
 
 
  1. User { myname: 'a' } 
  2. false 
  3. User { name: [Getter/Setter] } 
  4. true 

網(wǎng)站名稱:typescript中的class和interface
文章起源:http://www.dlmjj.cn/article/dheiiid.html