TypeScript體操類型練習

歷史小劇場

這個世界上,有兩種人最痛苦,第一種是身居高位者,第二種是身居底層者,第一種人很少,第二種人很多。第一種人叫崇禎,第二種人叫百姓。
而最幸福的,就是中間那撥人,主要工作,叫做欺上瞞下,具體特點是,除了好事,什么都辦;除了臉,什么都要。—《明朝那些事兒》

字符串模板與extends/infer

  • extends: 有兩個作用:1、接口繼承,2、類型判斷(這篇文章主要是體現這個作用);
  • infer: 推導泛型參數,只在extends右邊使用

案例

type str = "beyond";// 獲開頭
type getFirst<T> = T extends `${infer First}${infer Rest}`? First : never;
type FirstLetter = getFirst<str>; // type FirstLetter = "b"// 獲取除開頭的部分
type getRest<T> = T extends `${infer First}${infer Rest}` ? Rest : never;
type RestLetters = getRest<str>; // type RestLetters = "eyond"// 以y分隔
type Split<T> = T extends `${infer Front}y${infer Back}` ? Back : never;
type Splitted = Split<str>; // type Splitted = "ond"
判斷開頭
type startsWidth<str extends string, prefix extends string> = str extends `${prefix}${infer Rest}` ? true : false;
type startsWidthKong = startsWidth<"kong", "">; // type startsWidthKong = true
type StartsWithBe = startsWidth<str, "be">; //type StartsWithBe = true
type StartsWithC = startsWidth<str, "c">; // type StartsWithC = false
轉為首字母大寫
type UppercaseFirst<T extends string> = T extends `${infer First}${infer Rest}` ? `${Uppercase<First>}${Rest}` : never;
type UppercaseStr = UppercaseFirst<str>; // type UppercaseStr = "Beyond"
文本替換-替換第一個
type ReplaceOne<str extends string, from extends string, to extends string> = str extends `${infer Front}${from}${infer Rest}` ? `${Front}${to}${Rest}` : str;
type ReplaceStr = ReplaceOne<str, "o", "a">; // type ReplaceStr = "beyand"
鍵值對轉索引 a=1 => {a:1}
type ConvertStrToRecord<str extends string> = str extends `${infer key}=${infer value}` ? { [k in key]: value } : never;
type ConvertStrToRecordStr = ConvertStrToRecord<"a=1">; 
// type ConvertStrToIndexStr = {// a: "1";
// }

as 重映射-索引的重命名

索引轉大寫
interface IOut {aaa: 1,bbb: 2,fun: () => void
}
type UpperKeys<T extends Record<string, any>> = {[K in keyof T as (T[K] extends Function ? K : Uppercase<K>)]: T[K]
}
type res = UpperKeys<IOut>;
// type res = {
//     AAA: 1;
//     BBB: 2;
//     fun: () => void;
// }
合并索引
interface IOut2 {ccc: 3,ddd: 4
}
type CombineIndex<A extends Record<string, any>, B extends Record<string, any>> = {[K in keyof A | keyof B] : K extends keyof A ? A[K] : K extends keyof B ? B[K] : never
}
type combine = CombineIndex<IOut, IOut2>;
// type combine = {
//     aaa: 1;
//     bbb: 2;
//     fun: () => void;
//     ccc: 3;
//     ddd: 4;
// }

巧用遞歸

文本替換-替換所有
type ReplaceAll<Str extends string, From extends string, To extends string> = Str extends `${infer Front}${From}${infer Rest}` ? `${Front}${To}${ReplaceAll<Rest, From, To>}` : Str;
type ReplaceAllStr = ReplaceAll<"12333333456", "3", "A">; // type ReplaceAllStr = "12AAAAAA456"
字符串反轉
type Reverse<Str extends string, Res extends string = ""> = Str extends `${infer First}${infer Rest}` ? Reverse<Rest, `${First}${Res}`> : Res;
type ReverseStr = Reverse<"hello">; // type ReverseStr = "olleh"

綜合

字符串解析-初級

例如:我們要將 a=1&b=2&c=3 轉為 {a:1, b:2, c:3}
那么,我們要有按這三步走

  1. &分割取 鍵值對 處理
  2. 處理單個的 鍵值對 轉換為 索引類型
  3. 把 轉換后的 索引類型 合并
type Parse<Str extends string, Res extends Record<string, any> = {}> = Str extends `${infer One}&${infer Rest}` ?Parse<Rest, CombineIndex<Res, ConvertStrToRecord<One>>> :CombineIndex<Res, ConvertStrToRecord<Str>>type parseToRecord = Parse<"a=1&b=2&c=3">; // type parseToRecord = {a: "1", b: "2", c: "3"}
字符串解析-升級
  • 如果只有鍵沒有值,則返回 {key: true};
  • 合并重復索引。例如 a=1&a=2 轉為 {a: [‘1’, ‘2’]};
  • 合并的值不能重復。例如 a=1&a=2&a=2 轉為 {a: [‘1’, ‘2’]};
type ConvertStrToRecordUp<Str extends string> = Str extends `${infer Key}=${infer Value}` ? { [K in Key] : Value } : Str extends `${infer Key}` ? { [K in Key]: true } : {};
type ConvertStrToRecordUpStr = ConvertStrToRecordUp<"a">;
// type ConvertStrToRecordUpStr = {
//     a: true;
// }// 合并重復索引
type CheckDuplicate<A extends Record<string, any>, B extends Record<string, any>> = keyof B extends keyof A ? AddR<A, B> : CombineIndex<A, B>;
type AddR<A extends Record<string, any>, B extends Record<string, any>> = {[K in keyof A] : K extends keyof B ?CheckInclue<A[K], B[K]> extends true ? A[K] :  // 重復索引,合并值,值不能重復A[K] extends any[] ? [...A[K], B[K]] : [A[K], B[K]] : A[K]
}type CheckInclue<A extends any[], B extends string> = A extends [infer First, ...infer Rest] ? First extends B ? true : CheckInclue<Rest, B> : false;
type checkIncludeDemo = CheckInclue<["a", "b", "c"], "a">; // type checkIncludeDemo = truetype ParseUp<Str extends string, Res extends Record<string, any> = {}> = Str extends `${infer One}&${infer Rest}` ?ParseUp<Rest, CheckDuplicate<Res, ConvertStrToRecordUp<One>>> :CheckDuplicate<Res, ConvertStrToRecordUp<Str>>type parseToRecordUp = ParseUp<"a=1&b&a=2&a=3&c&d=4&e&e=10&a=3">; 
// type parseToRecordUp = {
//     b: true;
//     c: true;
//     a: ["1", "2", "3"];
//     e: [true, "10"];
//     d: "4";
// }

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

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

相關文章

Influence blocking maximization on networks: Models, methods and applications

abstract 由于各種社會和貿易網絡的不斷出現&#xff0c;網絡影響力分析引起了研究者的極大興趣。基于不同的影響力傳播模型&#xff0c;人們提出了許多網絡影響力最大化的新模型和方法。作為傳統影響力最大化問題的延伸和擴展&#xff0c;影響力封鎖最大化問題已成為研究熱點&…

借助 CloudFlare 增強站點內容保護防采集

今天在一位站長的幫助下實測了 CloudFlare 增強站點內容保護實現防采集的功能,效果那是杠杠的,如果您的站點原創內容比較多的話,明月強烈建議試試 CloudFlare 這個內容保護,無論是 WordPress 、Typecho 都有非常好的效果,并且幾乎沒有任何誤傷,搜索引擎爬蟲蜘蛛更是不會影…

【圖論】單源最短路

前言 今天&#xff0c;我們來講最短路&#xff0c;首先看只有一個起點&#xff08;單源&#xff09;的情況。 為了書寫方便&#xff0c;我們約定以下內容&#xff1a; template<class W> using Graph vector<vector<pair<int, W>>>; // 鄰接表(ve…

集中抄表電表是什么?

1.集中抄表電表&#xff1a;簡述 集中抄表電表&#xff0c;又稱為遠程抄表系統&#xff0c;是一種現代化電力計量技術&#xff0c;為提升電力行業的經營效率和客戶服務質量。它通過自動化的形式&#xff0c;取代了傳統人工抄水表&#xff0c;完成了數據信息實時、精確、高效率…

進制轉換【野路子改造】

非科班&#xff0c;一直都是自己的野路子&#xff0c;現在要回爐重造 十進制->二進制 基本思想&#xff1a; 開始寫的&#xff08;80%&#xff09;&#xff1a; #include<stdio.h> using namespace std; int main(){ int n; scanf("%d",&n); int a[1…

Spring -- DI

文章目錄 一、什么是DI二、注入的三種方式2.1 屬性注入 Autowired使用方法Autowired存在的問題以及解決方法Autowired問題的解決方法 2.2 構造方法注入2.3 setter方法注入2.4 三種注入方式優缺點分析 一、什么是DI 概念&#xff1a;DI(依賴注入)就是當我們把依賴對象取出來(創…

以太坊錢包

以太坊錢包是你通往以太坊系統的門戶。它擁有你的密鑰&#xff0c;并且可以代表你創建和廣播交易。選擇一個以太坊錢包可能很困難&#xff0c;因為有很多不同功能和設計選擇。有些更適合初學者&#xff0c;有些更適合專家。即使你現在選擇一個你喜歡的&#xff0c;你可能會決定…

mac m1 pcre.h 找不到

安裝suricata報錯&#xff1a; configure: error: pcre.h not found ... 解決&#xff1a; brew install pcre 找到這個文件的地址 brew list pcre | grep pcre.h$ /opt/homebrew/Cellar/pcre/8.45/include/pcre.h 程序搜索的地址 cpp -v /Library/Developer/CommandLineT…

5.26 基于UDP的網絡聊天室

需求&#xff1a; 如果有人發送消息&#xff0c;其他用戶可以收到這個人的群聊信息 如果有人下線&#xff0c;其他用戶可以收到這個人的下線信息 服務器可以發送系統信息實現模型 模型&#xff1a; 代碼&#xff1a; //chatser.c -- 服務器端實現 #include <stdio.h>…

hive初始化失敗報錯:Error: Duplicate key name ‘PCS_STATS_IDX‘ (state=42000,code=1061)

意思是key name ‘PCS_STATS_IDX’ (state42000,code1061)重復了&#xff0c;問題出在不是第一次初始化&#xff0c;因為我們在hive-site.xml中配置了 javax.jdo.option.ConnectionURL jdbc:mysql://192.168.200.137:3306/metastore?createDatabaseIfNotExisttrue JDBC conne…

JavaSE——類和對象(二)~~封裝

目錄 一.封裝 二.封裝擴展之包 三.static成員 四. 代碼塊 五. 內部類&#xff08;重要&#xff09; 大家好呀&#xff0c;我是北緯&#xff0c;接著上節我們繼續講解Java中關于類和對象的相關知識&#xff0c;今天著重給大家介紹一下關于面向對象程序的特性之一——封裝。…

【Linux】常用基礎命令 | 搭建云服務器優化環境 | 程序的部署

文章目錄 Linux常用命令及搭建環境一、LinuxLinux發行版 1.常用命令1.ls2.cd3.pwd4.touch5.cat6.echo7.vim8.mkdir9.rm10.mv11.cp12.man13.grep14.ps15.netstat 2.搭建Java Web程序的運行環境包管理器1.安裝JDK2.安裝Tomcat3.安裝mysql 3.程序的部署 Linux常用命令及搭建環境 …

貪心算法簡單介紹

貪心算法是一種在每一步選擇中都采取當前狀態下最優或最優近似的選擇&#xff0c;以期望最終得到全局最優解的算法。貪心算法并不總能得到全局最優解&#xff0c;但在某些問題上&#xff0c;它可以得到全局最優解&#xff0c;并且比動態規劃等其他方法更為簡單和高效。 貪心算…

Python庫之Scrapy的簡介、安裝、使用方法詳細攻略

Python庫之Scrapy的簡介、安裝、使用方法詳細攻略 簡介 Scrapy是一個快速的、高層次的web抓取和web抓取框架&#xff0c;用于抓取網站數據并從頁面中提取結構化的數據。Scrapy用途廣泛&#xff0c;可以用于數據挖掘、信息處理或存儲歷史數據&#xff0c;以及各種其他用途。 …

【AMS】Android 8.0+ 繞開啟動后臺Service限制

一、背景 應客戶要求,需要在開機時,拉起應用A。但因為開機時,同時被拉起的應用過多,導致Launcher在開機那一刻較為卡頓。為解決這一問題,采取了延遲拉起的做法。在開機后,延遲一定時間,由系統服務,拉起應用A。 于是乎,就出現這么個報錯: Not allowed to start ser…

vue3、vuex和vue-router入門指南

Vue 3、Vuex 和 Vue Router 都是 Vue.js 生態系統中非常有用的庫。它們各自在 Vue.js 應用程序中扮演著重要的角色&#xff1a;Vue 3 是核心框架&#xff0c;Vuex 用于狀態管理&#xff0c;而 Vue Router 用于路由管理。下面是如何在 Vue 3 項目中使用這些庫的簡要說明。 創建…

有趣的css - 移形換位加載動畫

大家好&#xff0c;我是 Just&#xff0c;這里是「設計師工作日常」&#xff0c;今天分享的是一個移形換位動態加載小動效&#xff0c;適用于 app 列表加載&#xff0c;頁面加載或者圖片懶加載等場景。 最新文章通過公眾號「設計師工作日常」發布。 目錄 整體效果核心代碼html…

2024上海初中生古詩文大會倒計時4個月:單選題真題解析(持續)

現在距離2024年初中生古詩文大會還有4個多月時間&#xff0c;我們繼續來看10道選擇題真題和詳細解析&#xff0c;以下題目截取自我獨家制作的在線真題集&#xff0c;都是來自于歷屆真題&#xff0c;去重、合并后&#xff0c;每道題都有參考答案和解析。 為幫助孩子自測和練習&…

C#基礎一

使用Visual Studio 2022&#xff08;VS2022&#xff09;編寫C#控制臺程序 1. 安裝Visual Studio 2022 確保已安裝Visual Studio 2022。如果未安裝&#xff0c;請從Visual Studio官網下載并安裝。 另一篇文章中已經有詳細描述&#xff0c;這里就不在細說了。 VisualStudio2022…

【LeetCode】【209】長度最小的子數組(1488字)

文章目錄 [toc]題目描述樣例輸入輸出與解釋樣例1樣例2樣例3 提示進階Python實現前綴和二分查找滑動窗口 個人主頁&#xff1a;丷從心 系列專欄&#xff1a;LeetCode 刷題指南&#xff1a;LeetCode刷題指南 題目描述 給定一個含有n個正整數的數組和一個正整數target找出該數組…