typeScript 接口和類

工具: PlayGround


接口

接口用來定義對象的結構和類型,描述對象應該具有哪些屬性和方法。

它僅用于聲明,而不是實現; 這對于編寫可重用的代碼非常有用。它可用于:

關鍵字是interface, 注意:它只是作為TypeScript的一部分,并不會轉換為JavaScript

  • 數組定義
interface data {[index:number]: number,
}// 類型一致,沒有問題
let numList_1: data = [1, 2, 3];
// Type 'string' is not assignable to type 'number'
let numList_2: data = [1, "", 3];
  • 對象的定義
// 方式1
interface Data_1 {name: string,age: number,
}
let data_1: Data_1 = {name: "hello",age: 20,
}
console.log(data_1);// 方式2
interface Data_2 {name: string;age: number;// 可選屬性, 表示可以選擇不賦值sex?: number;// 只讀屬性,表示一旦賦值后不可修改                       readonly id:number | string;   
}
let data_2: Data_2 = {name: "hello",age: 20,id : "0001",
}
data_2.age = 10;
// Error: Cannot assign to 'id' because it is a read-only property
data_2.id = 10;
  • 作為類實現
interface Person {name: string;age: number;greet: () => void;
}// 通過implements實現接口
class Student implements Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}greet() {console.log(`Hello, my name is ${this.name}`);}
}let student = new Student("ok", 20);
student.greet();        // "Hello, my name is ok" 

typeScript中類的使用,主要通過class來創建類對象,通過new來實例化類對象, 支持特性:

  • instanceof檢測對象類型

  • 訪問權限publicprotectedprivate

  • 函數重載

  • 繼承或重寫

  • 靜態成員和方法

基本的使用:

class Demo {private _name: string = "";private _age: number = 0;// 構造函數constructor(name:string) {this._name = name;} public log() {console.log(`Demo 的名字為${this._name}`);}
}
let demo = new Demo("demo");
console.log(typeof(demo));              // "object" 
console.log(demo instanceof Demo);      // true    

函數重載

類的函數重載的編寫方式,不要直接實現:

class Demo {private _name: string = "";private _age: number = 0;// 構造函數constructor(name:string) {//} // Error: Multiple constructor implementations are not allowed// 原因在于如果實現,編譯器創建對象不知道調用哪個構造函數constructor(name: string, age:number) {//}
}

可以通過采用聲明和可選參數的方式來實現:

// 實例1
class Demo {private _name: string = "";private _age: number = 0;// 構造函數constructor(name:string);constructor(name: string, age:number);constructor(name: string, age?:number) {this._name = name;if (age) {this._age = age;}}
}// 實例2:
class Calculator {add(a: number, b: number): number;add(a: string, b: string): string;add(a: any, b: any): any {if (typeof a === 'number' && typeof b === 'number') {return a + b;} else if (typeof a === 'string' && typeof b === 'string') {return a.concat(b);} else {throw new Error('Invalid arguments');}}
}const calculator = new Calculator();console.log(calculator.add(1, 2));      // 3
console.log(calculator.add('Hello', ' World')); // Hello World

繼承和重寫

繼承的話,使用extends, 如果對基類中的方法重新編寫,就是重寫

// 定義接口,簡單的實例可以忽略;增加的話,有助于理解代碼和重寫代碼相關
interface Animal {sound(): void;
}// 實現接口
class Cat implements Animal {private _breed: string;private _name: string = "Cat";constructor(breed: string) {this._breed = breed;}// 通過get和set的方式設置對象變量屬性get Name():string {return this._name;}set Name(name: string) {this._name = name;}sound(): void {console.log("貓");}
}// 繼承
class DomesticCat extends Cat {public log() {console.log("this is DomesticCat");}
}// 重寫
class WildCat extends DomesticCat {sound(): void {console.log("野貓叫聲");}
}const domesticCat = new DomesticCat("domesticCat");
domesticCat.Name = "短毛貓"
console.log(`cat Name: ${domesticCat.Name}`);   //"cat Name: 短毛貓" 
domesticCat.sound(); // 貓// 
const wildCat = new WildCat("豹貓");
wildCat.sound();    // 野貓叫聲

注意:

  • 如果未聲明訪問權限publicprotectedprivate,則默認為public
  • 對于變量,建議開頭增加下劃線_ 表示私有
  • 可以多繼承,只需要在extends后面添加類接口即可
  • 注意區分implementsextends,前者主要用于對interface聲明的方法等進行實現, 而后者主要應用于已經實現后的方法進行繼承或重寫。

Static

靜態變量或方法在類中聲明后,可以不通過new對象直接賦值或使用,但賦值后不可在改變。

class Demo {static value: number;static getValue() {console.log(`static value: ${Demo.value}`);}
}
Demo.value = 10;
Demo.getValue();        //"static value: 10" 

它常用于編寫單例模式,注意: 構造函數設置為私有,以保證對象的唯一性

class Singleton {private static instance: Singleton;private constructor() {// 私有化構造函數,防止外部實例化}public static getInstance(): Singleton {if (!Singleton.instance) {Singleton.instance = new Singleton();}return Singleton.instance;}public greet(): void {console.log("Hello");}
}// 創建單例實例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();console.log(instance1 === instance2); // trueinstance1.greet(); // "Hello" 
instance2.greet(); // "Hello" 

const

作為常量使用,在類中使用注意:

  • 只能用于修改基本數據類型和對象屬性字面量,不可用于修飾引用類型
  • 如果聲明const 一定要記得初始化,不能在構造函數或其他函數進行初始化
  • 聲明以后,其本質就是readonly 只讀屬性
class MyClass {readonly PI: number = 3.14;readonly config: { name: string, age: number } = { name: "John", age: 25 };constructor() {// this.PI = 3.14159;  // 錯誤,無法對只讀屬性進行重新賦值// this.config = { name: "Alice", age: 30 }; // 錯誤,無法對只讀屬性進行重新賦值this.config.name = "Alice"; // 正確,可以修改對象字面量屬性的值this.config.age = 30; // 正確,可以修改對象字面量屬性的值}printInfo(): void {console.log(`PI: ${this.PI}`);console.log(`Name: ${this.config.name}, Age: ${this.config.age}`);}
}const myObj = new MyClass();
myObj.printInfo();// "PI: 3.14" 
// "Name: Alice, Age: 30" 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43685.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43685.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43685.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OSPF在廣播類型的網絡拓撲中DR和BDR的選舉

指定路由器(DR): 一個網段上的其他路由器都和指定路由器(DR)構成鄰接關系,而不是它們互相之間構成鄰接關系。 備份指定路由器(BDR): 當DR出現問題,由BDR接…

redis事務對比Lua腳本區別是什么

redis官方對于lua腳本的解釋:Redis使用同一個Lua解釋器來執行所有命令,同時,Redis保證以一種原子性的方式來執行腳本:當lua腳本在執行的時候,不會有其他腳本和命令同時執行,這種語義類似于 MULTI/EXEC。從別…

中間件: Kafka安裝部署

單機部署 下載二進制包 cd /opt/soft/archive wget http://archive.apache.org/dist/kafka/3.2.0/kafka_2.12-3.2.0.tgz tar -zxf kafka_2.12-3.2.0.tgz -C ../ cd ../kafka_2.12-3.2.0修改配置 vim config/server.propertiesadvertised.listenersPLAINTEXT://39.105.11.50:…

C++系列-函數重載

C系列-函數重載 函數重載函數重載的條件函數重載注意事項引用作為重載函數重載遇到默認參數 函數重載 函數名可以相同, 提高復用性 函數重載的條件 同一個作用域下函數名相同函數參數不同 – 參數個數不同 – 參數順序不同 – 參數類型不同不可以使用返回值作為重…

UI和API自動化測試的失敗原因

一、UI自動化失敗原因: 界面發生了變化,但是腳本沒有更新腳本中的等待時間太短了,導致元素還沒出來就被判定為失敗了網絡因素,網絡如果太慢的話,界面元素的顯示就會滯后執行的時候突然彈出一個窗口影響了元素的定位Ag…

Python web實戰之Django 的跨站點請求偽造(CSRF)保護詳解

關鍵詞:Python、Web、Django、跨站請求偽造、CSRF 大家好,今天我將分享web關于安全的話題:Django 的跨站點請求偽造(CSRF)保護,介紹 CSRF 的概念、原理和保護方法. 1. CSRF 是什么? CSRF&#…

微服務與Nacos概述-6

RBAC 模型 RBAC 基于角色的訪問控制是實施面向企業安全策略的一種有效的訪問控制方式。 基本思想是,對系統操作的各種權限不是直接授予具體的用戶,而是在用戶集合與權限集合之間建立一個角色集合。每一種角色對應一組相應的權限。一旦用戶被分配了適當…

【MySQL】MySQL基礎知識詳解(一)

MySQL select列的別名去除重復行空值參與運算著重號查詢常數顯示表結構過濾數據 排序使用 ORDER BY 對查詢到的數據進行排序操作。使用列的別名,進行排序二級排序 分頁LIMIT 分頁顯示公式:(當前頁數減一)*每頁條數,每頁…

【AIGC】 快速體驗Stable Diffusion

快速體驗Stable Diffusion 引言一、安裝二、簡單使用2.1 一句話文生圖2.2 詳細文生圖 三、進階使用 引言 stable Diffusion是一款高性能的AI繪畫生成工具,相比之前的AI繪畫工具,它生成的圖像質量更高、運行速度更快,是AI圖像生成領域的里程碑…

【100天精通python】Day41:python網絡爬蟲開發_爬蟲基礎入門

目錄 專欄導讀 1網絡爬蟲概述 1.1 工作原理 1.2 應用場景 1.3 爬蟲策略 1.4 爬蟲的挑戰 2 網絡爬蟲開發 2.1 通用的網絡爬蟲基本流程 2.2 網絡爬蟲的常用技術 2.3 網絡爬蟲常用的第三方庫 3 簡單爬蟲示例 專欄導讀 專欄訂閱地址:https://blog.csdn.net/…

【玩轉Linux操作】crond的基本操作

🎊專欄【玩轉Linux操作】 🍔喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。 🎆音樂分享【Counting Stars 】 歡迎并且感謝大家指出小吉的問題🥰 文章目錄 🍔概述🍔命令?常用選項 🍔練…

軟件-常用軟件系統架構

目錄 1.客戶端-服務器架構 2.分布式架構 3.微服務架構 4.事件驅動架構 5.單體架構 6.混合架構 當我們談論系統架構時,可以將其比喻為一座房子的設計和結構,想象一下你計劃建造一座豪華別墅,你需要考慮各種因素:如房子的大小…

linux下常見編譯問題

linux下常見編譯問題 linux-cmake靜態編譯查看系統支持的的libc版本查看程序需要的動態鏈接庫查看程序需要的libc版本freebsd下 linux-cmake靜態編譯 CMakeLists.txt 添加 set(CMAKE_EXE_LINKER_FLAGS "-static")ELF 64-bit LSB executable, AMD x86-64, version 1…

【微服務】一文了解 Nacos

一文了解 Nacos Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石項目(完成微服務拆分和業務中臺建設),成長于十年雙十一的洪峰考驗,沉淀了簡單易用、穩定可靠、性能卓越的核心競爭力。 隨著云計算興起, 2018 2018 20…

編程練習(3)

一.選擇題 第一題: 函數傳參的兩個變量都是傳的地址,而數組名c本身就是地址,int型變量b需要使用&符號,因此答案為A 第二題: 本題考察const修飾指針變量,答案為A,B,C,D 第三題: 注意int 型變…

13---內嵌HTML和React

雖然Markdown本身不支持內嵌HTML和React&#xff0c;但可以在Markdown文檔中直接插入HTML代碼和React組件。 一、在markdown中內嵌HTML 在Markdown中&#xff0c;你可以使用HTML標簽來實現更復雜的樣式和布局。例如&#xff0c;你可以使用<div>標簽來創建一個容器&#…

算法與數據結構(五)--樹與二叉查找樹

符號表的增刪查操作&#xff0c;隨著元素個數N的增多&#xff0c;其耗時也是線性增多的&#xff0c;時間復雜度都是O(n)&#xff0c;為了提高運算效率&#xff0c;我們學習樹這種數據結構。 目錄 一.樹的基本定義 二.樹的相關術語 三.二叉樹的基本定義 四.二叉樹的鏈表實現…

leetcode 279. 完全平方數

2023.8.18 與零錢兌換相似&#xff0c;本題屬于完全背包問題&#xff1a;完全平方數為物品&#xff0c;整數n為背包。 直接上代碼&#xff1a; class Solution { public:int numSquares(int n) {vector<int> dp(n1 , INT_MAX);dp[0] 0;for(int i1; i*i<n; i){for(in…

時序預測 | MATLAB實現WOA-CNN-BiGRU鯨魚算法優化卷積雙向門控循環單元時間序列預測

時序預測 | MATLAB實現WOA-CNN-BiGRU鯨魚算法優化卷積雙向門控循環單元時間序列預測 目錄 時序預測 | MATLAB實現WOA-CNN-BiGRU鯨魚算法優化卷積雙向門控循環單元時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 時序預測 | MATLAB實現WOA-CNN-BiGRU鯨…

干翻Dubbo系列第十二篇:Dubbo協議介紹

文章目錄 文章說明 一&#xff1a;Dubbo協議 1&#xff1a;Dubbo協議簡介 2&#xff1a;Dubbo協議優點 3&#xff1a;Dubbo協議幀的組成 (一)&#xff1a;幻數 (二)&#xff1a;2Way (三)&#xff1a;event (四)&#xff1a;Serilization ID (五)&#xff1a;status …