typescript學習回顧(五)

今天來分享一下ts的泛型,最后來做一個練習

泛型

有時候,我們在書寫某些函數的時候,會丟失一些類型信息,比如我下面有一個例子,我想提取一個數組的某個索引之前的所有數據

function getArraySomeData(newArr, n:number) {let newArr2:any[] = [];newArr.forEach((it, i) => {if (n > i) {newArr2.push(it);}});return newArr2;
}const arr = getArraySomeData(['1112', '1213', '121'], 2);
console.log(arr)

但是這個數組它可以是任意類型的,可以是對象,字符串,數字數組,這個時候不約束的話會存在ts的隱患,這個時候就有了泛型的概念。

概念

泛型的一個概念:

泛型相當于是一個類型變量,在定義時,無法預先知道具體的類型,可以用該變量來代替,只有在調用時,才能確定它的類型

很多時候,TS會智能的根據傳遞的參數,推導出泛型的具體類型

我們可以把剛才的代碼使用泛型改成這種形式

function getArraySomeData<T>(newArr:T[], n:number) {let newArr2:T[] = [];newArr.forEach((it, i) => {if (n > i) {newArr2.push(it);}});return newArr2;
}const arr = getArraySomeData(['1112', '1213', '121'], 2);
console.log(arr)

如果沒有傳遞具體類型,無法完成推導,默認是空對象。

進行傳值

如果我 傳遞值只有ts會根據傳遞的類型進行嚴格類型檢查,如下圖,傳遞的是number,傳遞的就必須都是number

在這里插入圖片描述

泛型設置默認值
function getArraySomeData<T = number>(newArr:any[], n:number) {}
在類型別名、接口、類使用泛型

回調函數,判斷數組的某一項是否滿足條件,這個某一項可以用泛型來代替

類型別名

type callback<T> = (n:T,i:number) => boolean;

接口

下面手動寫了一個篩選的filter函數

interface callback<T> = (n:T,i:number) => boolean;function filter<T>(arr: T[], callback: callback<T>): T[] {const newArr: T[] = [];arr.forEach((n, i) => {if (callback(n, i)) {newArr.push(n);}});return newArr;
}

下面這個例子是一個數組幫助類,通過在類最外面設置了泛型T,來約束里面所有的方法的泛型,之后傳遞的所有的參數泛型以及數組放行,都是傳遞的值。

export class ArrayHelper<T> {constructor(private arr:T[]){}take(n: number): T[] {if (n >= this.arr.length) {return this.arr;}const newArr: T[] = [];for (let i = 0; i < n; i++) {newArr.push(this.arr[i])}return newArr;}shuffle() {for (let i = 0; i < this.arr.length; i++) {const targetIndex = this.getRandom(0, this.arr.length);const temp = this.arr[i];this.arr[i] = this.arr[targetIndex];this.arr[targetIndex] = temp;}}private getRandom(min: number, max: number) {const dec = max - min;return Math.floor(Math.random() * dec + min)}
}
泛型約束

這個是在有些特定場景的時候會需要使用,這里舉一個簡單的例子,我傳遞一個對象,然后我需要把這個對象的時間戳轉換成日期字符串的形式

function dateFormat<T>(obj:T):T{obj.time = util.timeFormat(obj.time);return obj;
}

這個時候,ts會智能報錯,報錯的位置是obj.time的位置,因為泛型可以傳遞的類型是任意的類型,所以我用對象屬性的方式,ts會進行報錯,所以這種情況需要類型的約束

具體怎么做呢,很簡單

interface hasTimePro{time : number
}function dateFormat<T extends hasTimePro>(obj:T):T{obj.time = util.timeFormat(obj.time);return obj;
}

上面通過接口定義要約束的泛型的類型,可以是對象,也可以是其他。然后在泛型里進行繼承,繼承這個接口,這樣就可以對這個泛型進行一個約束。

多泛型

在很多情況下,我們可能參數特別多,要限制的類和接口可能不止一個,所以ts同樣支持可以有多個泛型,具體的使用例子

我希望混合兩個 數組,數組1和數組2,兩個可能都是不一樣的數組,但是兩個數組長度必須一樣,至于傳遞什么類型不管,只負責混合。這里就可以通過英文逗號將泛型隔開,然后設置多個泛型

function mixinArray<T, K>(arr1: T[], arr2: K[]): (T | K)[] {if (arr1.length !== arr2.length) {throw new Error('兩個數組長度不等');}let result: (T | K)[] = [];for (let i = 0; i < arr1.length; i++) {result.push(arr1[i]);result.push(arr2[i]);}return result;
}const result = mixinArray([1, 3, 4], ["a", "b", "c"]);result.forEach(r => console.log(r));
小練習
開發一個字典類(Dictionary),字典里會保存鍵值對的數據鍵值對數據的特點:
- 鍵(key)可以是任何類型,但不允許重復
- 值(value)可以是任何類型
- 每一個鍵對應一個值
- 所有的鍵類型相同,所有的值類型相同字典類對鍵值對數組的操作:- 添加一個鍵值對
- 按照鍵刪除對應的鍵值對
- 循環每一個鍵值對
- 得到當前鍵值對的數量
- 判斷某個鍵是否存在
- 重新設置某個鍵的值,如果不存在,就添加
代碼
  • src

    • dictionary.ts
    export type CallBack<K, V> = (key: K, val: V) => voidexport class Dictonary<K, V> {private keys: K[] = [];private vals: V[] = [];get size() {return this.keys.length;}set(key: K, val: V) {const i = this.keys.indexOf(key)if (i < 0) {this.keys.push(key);this.vals.push(val);} else {this.vals[i] = val;}}forEach(callback: CallBack<K, V>) {this.keys.forEach((k, i) => {const v = this.vals[i];callback(k, v);});}has(key: K) {return this.keys.includes(key);}delete(key: K) {const i = this.keys.indexOf(key);if (i === -1) {return;}this.keys.splice(i, 1);this.vals.splice(i, 1);}
    }
    
    • index.ts
    import { Dictonary } from "./dictionary";const dic = new Dictonary<string, number>();dic.set('a', 1);
    dic.set('b', 1);
    dic.set('a', 12);
    dic.set('c', 1231);dic.forEach((d,i)=>{console.log(`key:${d},v:${i}`)
    });dic.delete('b');dic.forEach((d,i)=>{console.log(`key:${d},v:${i}`)
    });console.log('當前鍵值對的數量:' + dic.size)
    

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

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

相關文章

JVM原理(十):JVM虛擬機調優分析與實戰

1. 大內存硬件上的程序部署策略 這是筆者很久之前處理過的一個案例&#xff0c;但今天仍然具有代表性。一個15萬PV/日左右的在線文檔類型網站最近更換了硬件系統&#xff0c;服務器的硬件為四路志強處理器、16GB物理內存&#xff0c;操作系統為64位CentOS5.4&#xff0c;Resin…

js數組方法歸納——concat、join、reverse

1、concat( ) 用途&#xff1a;可以連接兩個或多個數組&#xff0c;并將新的數組返回該方法不會對原數組產生影響 var arr ["孫悟空","豬八戒","沙和尚"];var arr2 ["白骨精","玉兔精","蜘蛛精"];var arr3 [&…

Vue Router的深度解析

引言 在現代Web應用開發中&#xff0c;客戶端路由已成為實現流暢用戶體驗的關鍵技術。與傳統的服務器端路由不同&#xff0c;客戶端路由通過JavaScript在瀏覽器中控制頁面內容的更新&#xff0c;避免了頁面的全量刷新。Vue Router作為Vue.js官方的路由解決方案&#xff0c;以其…

阿里云centos 取消硬盤掛載并重建數據盤信息再次掛載

一、取消掛載 umount [掛載點或設備] 如果要取消掛載/dev/sdb1分區&#xff0c;可以使用以下命令&#xff1a; umount /dev/sdb1 如果要取消掛載在/mnt/mydisk的掛載點&#xff0c;可以使用以下命令&#xff1a; umount /mnt/mydisk 如果設備正忙&#xff0c;無法立即取消…

【Spring Boot】簡單了解spring boot支持的三種服務器

Tomcat 概述&#xff1a;Tomcat 是 Apache 軟件基金會&#xff08;Apache Software Foundation&#xff09;的 Jakarta EE 項目中的一個核心項目&#xff0c;由 Apache、Sun 和其他一些公司及個人共同開發而成。它作為 Java Servlet、JSP、JavaServer Pages Expression Languag…

系統安全及應用(命令)

目錄 一、賬號安全控制 1.1 系統賬號清理 1.2 密碼安全控制 1.3 歷史記錄控制 1.4 終端自動注銷 二、系統引導和登陸控制 2.1 限制su命令用戶 2.2 PAM安全認證 示例一&#xff1a;通過pam 模塊來防止暴力破解ssh 2.3 sudo機制提升權限 2.3.1 sudo命令&#xff08;ro…

Java的日期類常用方法

Java_Date 第一代日期類 獲取當前時間 Date date new Date(); System.out.printf("當前時間" date); 格式化時間信息 SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-mm-dd hh:mm:ss E); System.out.printf("格式化后時間" si…

【windows|012】光貓、路由器、交換機詳解

&#x1f341;博主簡介&#xff1a; &#x1f3c5;云計算領域優質創作者 &#x1f3c5;2022年CSDN新星計劃python賽道第一名 &#x1f3c5;2022年CSDN原力計劃優質作者 ? &#x1f3c5;阿里云ACE認證高級工程師 ? &#x1f3c5;阿里云開發者社區專家博主 &#x1f48a;交流社…

windows USB 驅動開發-URB結構

通用串行總線 (USB) 客戶端驅動程序無法直接與其設備通信。 相反&#xff0c;客戶端驅動程序會創建請求并將其提交到 USB 驅動程序堆棧進行處理。 在每個請求中&#xff0c;客戶端驅動程序提供一個可變長度的數據結構&#xff0c;稱為 USB 請求塊 (URB) &#xff0c;URB 結構描…

ctfshow-web入門-命令執行(web75-web77)

目錄 1、web75 2、web76 3、web77 1、web75 使用 glob 協議繞過 open_basedir&#xff0c;讀取根目錄下的文件&#xff0c;payload&#xff1a; c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). ); } ex…

讀書筆記-Java并發編程的藝術-第3章(Java內存模型)-第9節(Java內存模型綜述)

3.9 Java內存模型綜述 前面對Java內存模型的基礎知識和內存模型的具體實現進行了說明。下面對Java內存模型的相關知識做一個總結。 3.9.1 處理器的內存模型 順序一致性內存模型是一個理論參考模型&#xff0c;JMM和處理器內存模型在設計時通常會以順序一致性內存模型為參照。…

ORB-SLAM2 安裝編譯運行(非 ROS)

安裝編譯 必備安裝工具 主要包括 cmake 、 git 、 gcc 、 g gcc 的全稱是 GNU Compiler Collection&#xff0c;它是由 GNU 推出的一款功能強大的、性能優越的 多平臺編譯器&#xff0c;是一個能夠編譯多種語言的編譯器。最開始 gcc 是作為 C 語言的編譯器&#xff08;GNU …

如何將等保2.0的要求融入日常安全運維實踐中?

等保2.0的基本要求 等保2.0是中國網絡安全領域的基本國策和基本制度&#xff0c;它要求網絡運營商按照網絡安全等級保護制度的要求&#xff0c;履行相關的安全保護義務。等保2.0的實施得到了《中華人民共和國網絡安全法》等法律法規的支持&#xff0c;要求相關行業和單位必須按…

C#/WPF 自制白板工具

隨著電子屏幕技術的發展&#xff0c;普通的黑板已不再適用現在的教學和演示環境&#xff0c;電子白板應運而生。本篇使用WPF開發了一個電子白板工具&#xff0c;功能豐富&#xff0c;非常使用日常免費使用&#xff0c;或者進行再次開發。 示例代碼如下&#xff1a; Stack<St…

拓撲排序[講課留檔]

拓撲排序 拓撲排序要解決的問題是給一個有向無環圖的所有節點排序。 即在 A O E AOE AOE網中找關鍵路徑。 前置芝士&#xff01; 有向圖&#xff1a;有向圖中的每一個邊都是有向邊&#xff0c;即其中的每一個元素都是有序二元組。在一條有向邊 ( u , v ) (u,v) (u,v)中&…

JavaScript 動態網頁實例 —— 廣告效果

廣告是現代網頁設計中不可或缺的內容。廣告可以有很多種形式,但最終目的都是要吸引觀眾的注意力。盡管廣告少不了畫面、音效和廣告語等效果,但其實現主要還是應用JavaScript 代碼,只要很好掌握了JavaScript程序設計,剩下的就是創意和美工了。本章介紹幾種廣告效果,包括對聯…

ChatGPT 官方發布桌面端,向所有用戶免費開放

Open AI 官方已經發布了適用于 macOS 的 ChatGPT 桌面端應用。 此前&#xff0c;該應用一直處于測試階段&#xff0c;僅 Plus 付費訂閱用戶可以使用。 目前已面向所有用戶開放&#xff0c;所有 Mac 用戶均可免費下載使用。 我們可以訪問官網下載安裝包&#xff1a;https://op…

Java利用poi實現word,excel,ppt,pdf等各類型文檔密碼檢測

介紹 最近工作上需要對word,excel,ppt,pdf等各類型文檔密碼檢測&#xff0c;對文件進行分類&#xff0c;有密碼的和沒密碼的做區分。查了一堆資料和GPT都不是很滿意&#xff0c;最后東拼西湊搞了個相對全面的檢測工具代碼類&#xff0c;希望能給需要的人帶來幫助。 說明 這段…

PHP 爬蟲之使用 Curl庫抓取淘寶商品列表數據網頁的方法

使用 PHP 的 cURL 庫來抓取淘寶商品列表數據網頁需要謹慎&#xff0c;因為淘寶等電商平臺通常會有反爬蟲機制&#xff0c;以防止數據被濫用。然而&#xff0c;如果你只是出于學習目的&#xff0c;并且了解并遵守了淘寶的robots.txt文件和相關的使用條款&#xff0c;你可以嘗試使…

2024 年江西省研究生數學建模競賽題目 B題投標中的競爭策略問題--完整思路、代碼結果分享(僅供學習)

招投標問題是企業運營過程中必須面對的基本問題之一。現有的招投標平臺有國家級的&#xff0c;也有地方性的。在招投標過程中&#xff0c;企業需要全面了解招標公告中的相關信息&#xff0c;在遵守招投標各種規范和制度的基礎上&#xff0c;選擇有效的競爭策略和技巧&#xff0…