您好,登錄后才能下訂單哦!
這篇文章主要介紹了TypeScript中的class和interface怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇TypeScript中的class和interface怎么用文章都會有所收獲,下面我們一起來看看吧。
首頁我們要清楚的一點是 TypeScript 中類和 JavaScript 中ES6語法類的區別,千萬不要混淆。ts 中相比于 js 添加了聲明屬性的類型和參數的類型以及返回結果類型。這個地方一看就會一寫就不對,如果不聲明 ts 會報錯。
class Person{ name:string; constructor(name:string){ this.name = name; } getName():void{ console.log(this.name); } }
class Person{ constructor(name){ this.name = name; } getName(){ console.log(this.name); } }
ES5編輯后的結果
var Person = /** @class */ (function () { function Person(name) { this.name = name; } Person.prototype.getName = function () { console.log(this.name); }; return Person; }());
ts 在編譯 get 和 set 的時候默認是 es3 編譯,vscode 編輯器會報錯error TS1056: Accessors are only available when targeting ECMAScript 5 and higher
需要編譯到版本 ES5 或以上,解決辦法:$ tsc xxx.ts -t es5
。
class User{ myname:string; constructor(myname:string){ this.myname = myname } get name(){ return this.myname } set name(newName:string){ this.myname = newName } }
ES5編譯后的結果
var User = /** @class */ (function () { function User(myname) { this.myname = myname; } Object.defineProperty(User.prototype, "name", { get: function () { return this.myname; }, set: function (newName) { this.myname = newName; }, enumerable: false, configurable: true }); return User; }());
這里有幾個思考問題,答案見文末:
var u = new User("a"); console.log(u); console.log(u.myname); u.myname = 'b'; console.log(u.myname); console.log(u.hasOwnProperty("name")); console.log(Object.getPrototypeOf(u)); console.log(Object.getPrototypeOf(u).hasOwnProperty("name"));
abstract
關鍵字表示抽象類,抽象類是不能被實例化即new,只能被繼承,抽象類一般是用來封裝一些公共的,提供給子類使用的方法和屬性的
abstract class Animal{ public readonly name:string; protected age:number = 38; private money:number = 10; constructor(name:string){ this.name = name } } class Dog extends Animal{ static className = 'Dog' static getClassName(){ console.log(this.className) } getName(){ console.log(this.name) } getAge(){ console.log(this.age) } } let a = new Animal("ss");
這里打印看一下繼承的結果:
console.log(a); //Dog { age: 38, money: 10, name: 'ss' }
這里順便說一下訪問修飾符 public
protected
private
public 里里外外都能訪問,包括自己、自己的子類、其他類都能
protected 自己和子類能訪問但是其他地方不能訪問
private 私有的(只有自己能訪問,子類的其他都不能訪問)
interface Rectangle { width: number; height: number } let r: Rectangle = { width: 100, height: 10 } interface Speakable { speak(): void; name?: string } let speaker: Speakable = { //name:"bdt", speak() { } }
interface AnimalLink { eat(): void; move(): void }
interface PersonLike extends AnimalLink { speak(): void } class Person2 implements PersonLike { speak() { }; eat() { }; move() { } }
interface Person3 { readonly id: number; name: string; [PropName: string]: any } let p1: Person3 = { id: 1, name: "sss" }
interface DiscountInterface{ (price:number):number } let discount:DiscountInterface = function (price: number): number { return price * .8 }
interface UserInterface{ [index:number]:string } let arr:UserInterface = ['aa','bb'] interface UserInterface2{ [index:string]:string } let obj:UserInterface2 = {name:"sss"}
class Animal3{ constructor(public name:string){} } interface WithClassName{ new (name:string):Animal3 } function createClass(clazz:WithClassName,name:string){ return new clazz(name) } let a3 = createClass(Animal3,"別抖腿"); console.log(a3)
class 類聲明并實現方法
interface 接口聲明,但是不能實現方法
abstract class Animal{ name:string="111"; abstract speak():void; //抽象類和方法不包含具體實現 必須在子類中實現 } //接口里的方法都是抽象的 interface Flying{ fly():void } interface Eating{ eat():void } class Dog extends Animal{ speak(){ console.log("汪汪汪") //重寫:子類重寫繼承自父類中的方法 } } class Cat extends Animal implements Flying,Eating{ speak(){ //繼承抽象類的方法必須實現 console.log("喵喵喵") } fly(){ console.log("我是一只飛貨") } eat(){ console.log("我是一只吃貨") } }
文中答案
User { myname: 'a' } a b false User { name: [Getter/Setter] } true
關于“TypeScript中的class和interface怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“TypeScript中的class和interface怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。