自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

typescript中的class和interface

開發(fā)
剛剛的vue3.0一發(fā)布,各大網(wǎng)址和社區(qū)以及公眾號已經(jīng)被Vue3.0的One Piece版本所霸屏,出現(xiàn)不同的標(biāo)題有著同樣內(nèi)容的現(xiàn)象,借此熱度我們不如好好回顧一下ts基礎(chǔ)知識,備戰(zhàn)vue3.0的正式使用。

[[343370]]

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

接口可以實現(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 類聲明并實現(xiàn)方法
interface 接口聲明,但是不能實現(xiàn)方法

  1. abstract class Animal{ 
  2.     name:string="111"
  3.     abstract speak():void;  //抽象類和方法不包含具體實現(xiàn)  必須在子類中實現(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(){   //繼承抽象類的方法必須實現(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 

 

 

責(zé)任編輯:姜華 來源: 小丑的小屋
相關(guān)推薦

2009-08-27 16:22:58

interfaceabstract cl

2009-08-27 15:48:40

interfaceabstract cl

2022-09-02 09:02:44

TypeInterface

2022-05-06 09:21:21

TypeScriptinterfacetype

2021-06-23 08:01:18

TypeScript interface type

2021-08-05 08:32:45

TypeScript InterfaceType

2022-11-30 07:17:53

2021-08-04 08:33:59

TypeScriptConst Readonly

2021-07-27 06:06:34

TypeScript語言運(yùn)算符

2011-07-06 15:14:34

iOS Xcode

2023-03-30 07:52:03

Golang接口

2023-12-07 11:47:00

TypeScript特殊值

2012-12-24 13:30:34

iOS

2022-04-11 08:42:09

TypeScript子類型定義

2024-05-11 10:19:31

TypeScript類型接口

2022-08-08 09:00:42

TypeScript映射類型

2021-08-02 07:57:03

SynchronizeJava語言

2021-08-24 10:25:19

thisclassJava

2010-09-14 15:24:49

CSSIDClass

2023-04-14 15:44:20

TypeScrip函數(shù)重載
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號