TypeScript中泛型對象、泛型類

一. 概覽

本文詳細介紹泛型中泛型對象和泛型類的使用,結合實際應用場景,加深對泛型的理解、使用。

二. 泛型對象

舉個例子

const test = {a: 1,b: 1
}

一個類型有沒有一種可能讓我么在定義的時候傳入一個類似于變量的形參,在使用的時候傳入具體的類型參數。在定義前不知道具體的參數類型

當然我們也可以定義為any,但是和沒有限制差別不大

引入泛型對象

interface ITest<T> {id: Number,content: T,completed: boolean
}const test:ITest<string> = {id: 1,content: '',completed: true
}

泛型實參會限制泛型形參變量的類型

作為函數的形參和實參

function createTodo<T>({id,content,completed
}: ITest<T>) {return {id,content,completed}
}const todo1 = createTodo<string[]>({id:2, content: ['唱','跳','rap'],completed:true})

三. 泛型類

在class中,所以屬性都應該是私有的,如果需要獲取屬性,設置屬性都應該由公共的getter setter方法去完成。
完整代碼


interface ITodoProps<T> {id: number,content: T;completed: boolean
}interface ITodo<T> {get(): ITodoProps<T>,create():string
}class Todo<T> implements ITodo<T>{private id: number;private content: T;private completed: boolean;constructor(id: number, content: T, completed: boolean) {this.id = id;this.content = content;this.completed = completed;}get(): ITodoProps<T> {return {id: this.id,content: this.content,completed: this.completed}}create(): string {if (typeof this.content === "string") {return this.createStringContent(this.content);} else if (Array.isArray(this.content) && typeof this.content[0] === "string") {return this.createArrayContent(this.content as string[]);} else {return this.createObjectContent(this.content);}}private createStringContent(content: string): string {return content}private  createArrayContent(content: string[]): string {return content.join(',')}private createObjectContent(content: T): string {let _content = '';for (let key in content) {let _content = "";_content += `${key}: ${content[key]}`}return _content}
}const todo11 = new Todo<string[]>(2,['逛街','打球','看電影'],false)const todo12= new Todo<{[key:string]:number}>(3, {sleep:1,walking:2,study:3},false)const todoString111 =todo11.create()const todoString112=todo12.create()const todoList = [todoString111,todoString112]const todo1 = todo11.get()const todo2 = todo12.get()function getTodoProp<T, K extends keyof T>(todo: T,key: K) {return todo[key]}getTodoProp(todo1,'id')

可以結合例子,去看泛型類的使用

keyof的使用

 function getTodoProp<T, K extends keyof T>(todo: T,key: K) {return todo[key]}getTodoProp(todo1,'id')

疑問:getTodoProp(todo1,‘id’)為什么可以編譯成功,不需要傳T的具體類型嗎?

解答:

  1. getTodoProp 函數使用了泛型和 TypeScript 的索引類型查詢,可以在不使用 T 類型的情況下獲取 todo 對象上的 key 屬性對應的值。
  2. 在函數定義中,泛型類型參數 T 表示傳入的 todo 參數的類型,而泛型類型參數 K 是具有約束條件 extends keyof T 的索引類型查詢,表示必須是 T 對象的屬性名之一。

當我們在調用 getTodoProp 函數時,傳入了一個 todo1 對象作為 todo 參數,而 TypeScript 會根據該對象的類型自動推斷 T 類型為:
{
id: number;
content: string;
}

在 getTodoProp(todo1, ‘id’) 調用中,K 類型被推斷為 ‘id’,因此 key 參數的類型為 ‘id’,這個類型也符合泛型類型參數 K 的約束條件。

類似地

function getSplitValue3<E>(value: E[],type: string):string {return value.join(type)
}const aa = getSplitValue3<string>(['a','b','c'],',')
const bb = getSplitValue3<number>([1,2,3],',')

可以省略為

function getSplitValue3<E>(value: E[],type: string):string {return value.join(type)
}const aa = getSplitValue3(['a','b','c'],',')
const bb = getSplitValue3([1,2,3],',')

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

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

相關文章

Jtti:香港云服務器如何實現遠程連接?

云服務器具有靈活擴展、高可用性、易于管理和數據安全等優點&#xff0c;因此被廣泛應用于各種業務場景。然而&#xff0c;對于初次使用云服務器的用戶來說&#xff0c;如何實現遠程連接可能是一個難題。本文將詳細介紹云服務器實現遠程連接的步驟和注意事項&#xff0c;幫助用…

教你pycharm運行Django第一個項目

文章目錄 前言搭建Django:1.新建Django項目&#xff1a;2.為Django項目指定遠程中創建的虛擬環境下的python解釋器&#xff1a;3.配置ubuntu的端口轉發&#xff08;添加端口號為1234的端口&#xff09;&#xff1a;關于Python技術儲備一、Python所有方向的學習路線二、Python基…

循環單向鏈表與約瑟夫問題

循環鏈表介紹 先不急著看約瑟夫問題是什么&#xff0c;先了解循環鏈表的結構&#xff0c;那什么是循環鏈表&#xff1f; 循環&#xff0c;顧名思義&#xff0c;從鏈表中第一個節點出發&#xff0c;還會遇到第一個節點&#xff0c;形成循環的一環。也就是說鏈表中最后一個節點…

python 使用 watchdog 實現類似 Linux 中 tail -f 的功能

一、代碼實現 import logging import os import threading import timefrom watchdog.events import FileSystemEventHandler from watchdog.observers import Observerlogger logging.getLogger(__name__)class LogWatcher(FileSystemEventHandler):def __init__(self, log_…

《opencv實用探索·十五》inRange二值化圖像

opencv接口如下&#xff1a; void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);函數實現二值化功能&#xff0c;主要是將在兩個閾值內的像素值設置為白色&#xff08;255&#xff09;&#xff0c;而不在閾值區間內的像素值設置為黑色&am…

一篇文章帶你快速入門 Nuxt.js 服務端渲染

1. Nuxt.js 概述 1.1 我們一起做過的SPA SPA&#xff08;single page web application&#xff09;單頁 Web 應用&#xff0c;Web 不再是一張張頁面&#xff0c;而是一個整體的應用&#xff0c;一個由路由系統、數據系統、頁面&#xff08;組件&#xff09;系統等等&#xff0…

什么是HTTPS加密協議?HTTPS安全傳輸原理,SSL和TLS介紹,NGINX如何配置SSL證書

HTTPS介紹 HTTPS是超文本傳輸協議&#xff08;HTTP&#xff09;的安全版本。它使用SSL&#xff08;安全套接層&#xff09;或TLS&#xff08;傳輸層安全&#xff09;加密協議來保護數據傳輸的安全性和機密性&#xff0c;以防止未經授權的訪問和竊聽。HTTPS協議通常用于處理敏感…

HbuilderX使用Uniapp+Vue3安裝uview-plus

如果你是vue2版本想使用uniapp去配置uviewui庫可以參考之前的文章 小程序的第三方ui庫推薦較多的還是uview的&#xff0c;看起來比較美觀&#xff0c;功能也比較完善&#xff0c;下面將提一下Vue3安裝uview-plus庫的教程 創建項目 安裝 首先進入官網 uView-Plus 直接下載并導…

預訓練--微調

預訓練–微調 一個很簡單的道理&#xff0c;如果我們的模型是再ImageNet下訓練的&#xff0c;那么這個模型一定是會比較復雜的&#xff0c;意思就是這個模型可以識別到很多種類別的即泛化能力很強&#xff0c;但是如果要它精確的識別是否某種類別&#xff0c;它的表現可能就不…

07-2 Python模塊和命名空間

1. 模塊 概念&#xff1a;其實就是一個Python文件&#xff0c;正常文件有的變量&#xff0c;函數&#xff0c;類&#xff0c;模塊都有 功能:模塊可以被其它程序引入&#xff0c;以使用該模塊中的函數等功能。 示例&#xff1a;test-module.py調用mymodule.py模塊中的now_time…

充電樁IC

充電樁IC 電子元器件百科 文章目錄 充電樁IC前言一、充電樁IC是什么二、充電樁IC的類別三、充電樁IC的應用實例四、充電樁IC的工作原理總結前言 充電樁IC的設計和功能會根據不同的充電協議和市場需求進行調整和定制。目前市場上有許多不同型號和廠家的充電樁IC可供選擇,以滿足…

一篇文章帶你快速入門 Vue 核心語法

一篇文章帶你快速入門 Vue 核心語法 一、為什么要學習Vue 1.前端必備技能 2.崗位多&#xff0c;絕大互聯網公司都在使用Vue 3.提高開發效率 4.高薪必備技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (讀音 /vju?/&#xff0c;類似于 view) …

Mysql 日期函數大全

一、時間函數 &#xff08;一&#xff09;、獲取當前時間 1、NOW() 獲取當前日期和時間&#xff0c;在程序一開始執行便拿到時間 返回格式 YYYY-MM-DD hh:mm:ss eg&#xff1a; NOW() 得到 2023-12-03 12:20:02 NOW(),SLEEP(2),NOW() 得到 2023-12-03 12:20:02 | 0 | 2023-…

目標檢測——OverFeat算法解讀

論文&#xff1a;OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 作者&#xff1a;Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun 鏈接&#xff1a;https://arxiv.org/abs/1312.6229 文章…

Go語言-讓我印象深刻的13個特性

我們正在加速進入云原生時代&#xff0c;Go語言作為云原生的一塊基石&#xff0c;確有它的獨到之處。本文介紹Go語言的幾個讓我印象深刻的特性。 1、兼顧開發效率和性能 Go語言兼顧開發效率和性能。可以像Python那樣有很快的開發速度&#xff0c;也可以像C那樣有很快的執行速…

SpringAOP專欄二《原理篇》

上一篇SpringAOP專欄一《使用教程篇》-CSDN博客介紹了SpringAop如何使用&#xff0c;這一篇文章就會介紹Spring AOP 的底層實現原理&#xff0c;并通過源代碼解析來詳細闡述其實現過程。 前言 Spring AOP 的實現原理是基于動態代理和字節碼操作的。不了解動態代理和字節碼操作…

【C語言】函數遞歸詳解(一)

目錄 1.什么是遞歸&#xff1a; 1.1遞歸的思想&#xff1a; 1.2遞歸的限制條件&#xff1a; 2.遞歸舉例&#xff1a; 2.1舉例1&#xff1a;求n的階乘&#xff1a; 2.1.1 分析和代碼實現&#xff1a; 2.1.2圖示遞歸過程&#xff1a; 2.2舉例2&#xff1a;順序打印一個整數的…

機器學習---集成學習的初步理解

1. 集成學習 集成學習(ensemble learning)是現在非常火爆的機器學習方法。它本身不是一個單獨的機器學 習算法&#xff0c;而是通過構建并結合多個機器學習器來完成學習任務。也就是我們常說的“博采眾長”。集 成學習可以用于分類問題集成&#xff0c;回歸問題集成&#xff…

多線程并發Ping腳本

1. 前言 最近需要ping地址&#xff0c;還是挺多的&#xff0c;就使用python搞一個ping腳本&#xff0c;記錄一下&#xff0c;以免丟失了。 2. 腳本介紹 首先檢查是否存在True.txt或False.txt文件&#xff0c;并在用戶確認后進行刪除&#xff0c;然后從IP.txt的文件中讀取IP地…

CSS——sticky定位

1. 大白話解釋sticky定位 粘性定位通俗來說&#xff0c;它就是相對定位relative和固定定位fixed的結合體&#xff0c;它的觸發過程分為三個階段 在最近可滾動容器沒有觸發滑動之前&#xff0c;sticky盒子的表現為相對定位relative【第一階段】&#xff0c; 但當最近可滾動容…