成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

TypeScript 類型挑戰:元組轉換為對象

開發 前端
一些前端面試中考察到了 TypeScript 高級類型的定義,本系列主要解答來自 Type Challenges 項目中的 TS 類型挑戰問題,以此更好的了解 TS 的類型系統,編寫自己的類型工具,更好的應對前端面試。

高質量的類型可以提高項目的可維護性并避免一些潛在的漏洞。

一些前端面試中考察到了 TypeScript 高級類型的定義,本系列主要解答來自 Type Challenges 項目中的 TS 類型挑戰問題,以此更好的了解 TS 的類型系統,編寫自己的類型工具,更好的應對前端面試。

下面來看一個難度為簡單的題目:元組轉換為對象

題目描述

傳入一個元組類型,將這個元組類型轉換為對象類型,這個對象類型的鍵/值都是從元組中遍歷出來。

例如:

const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as const

type result = TupleToObject<typeof tuple>
// expected { tesla: 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}

題目解答

我們需要從數組中獲取所有值,并將其作為新對象中的鍵和值。

首先我們知道什么是元組,來看TypeScript 對元組的定義:

元組類型是另一種Array類型,它確切地知道包含多少個元素,以及它在特定位置包含哪些類型。

這意味著我們可以檢查length并得到確切的數字:

const fullName:[first: string, last: string] = ['hello', 'world'];
const range:[start: number, end: number] = [0, 10];
const digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] as const;

type FullNameLength = (typeof fullName)['length'] // 2
type RangeLength = (typeof range)['length'] // 2
type DigitsLength = (typeof digits)['length'] // 10

而在數組中就無法實現這一點:

const fullName:string[] = ['hello', 'world'];
const range:number[] = [0, 10];

type FullNameLength = (typeof fullName)['length'] // number
type RangeLength = (typeof range)['length'] // number

可以使用映射類型來遍歷對象:

type MappedType<T> = {
[Key in keyof T]: T[Key];
};
  • keyof T用于從對象類型T中獲取鍵值 key;
  • in用于對對象鍵值key進行迭代;
  • Key 就是對象鍵值 key 本身;
  • T[Key]是指定 Key 的值;

我們使用索引訪問類型來遍歷元組,可以通過T[number]從元組中獲取值。具體實現如下:

type TupleToObject<T> = {
[Value in T[number]]: Value;
};
  • T[number] 用于從元組 T 中獲取值;
  • in 用于迭代元組值;
  • Value 是元組元素,用作構建對象的key和value。

但是這時候報錯了:

這時就需要約束泛型的類型,最終的實現如下:

type TupleToObject<T extends readonly any[]> = {
[Value in T[number]]: Value;
};

這里的extends readonly any[] 是調用T[number] 所必須的,用來約束 T 的類型,T是一個元組,元組元素是只讀的。

Type Challenges:https://github.com/type-challenges/type-challenges

責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2022-05-04 09:02:41

TypeScript類型工具

2024-03-26 06:53:41

Python元組轉換JSON對象

2009-07-15 16:56:59

Jython類型Java類型

2023-07-12 08:29:58

TypeScrip元組元素

2022-06-01 08:12:32

JS類數組對象

2024-08-12 08:50:17

2023-10-16 09:26:48

CSS類型轉換

2023-03-03 10:26:49

Python內建庫模塊

2011-06-01 10:19:41

基類對象派生類對象

2021-01-18 08:52:28

Java對象多態

2009-07-14 09:06:08

Java對象類型轉換

2016-12-14 09:07:54

日期轉換中文

2010-10-27 13:25:33

Oracle查詢

2022-09-20 14:43:55

TypeScript類型體操

2021-01-13 05:18:50

數據類型性能

2022-02-25 09:06:02

TypeScripnever工具

2021-07-27 06:06:34

TypeScript語言運算符

2009-06-05 11:16:58

字符串動態轉換

2021-08-30 07:22:15

Go類型interface

2024-10-30 08:00:00

Python列表元組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍偷拍一区二区三区 | av网站在线看 | 国产一区二区三区在线看 | 国产精品久久久久无码av | 国产高清视频在线观看 | 欧州一区 | 永久免费av| 亚洲欧洲激情 | 国产一区二区三区视频免费观看 | 欧美成ee人免费视频 | 特级黄一级播放 | 午夜精品一区二区三区在线观看 | 亚洲第一中文字幕 | 狠狠伊人| 亚洲婷婷六月天 | 黄色91在线 | 日韩欧美一区二区三区 | 在线观看亚洲一区二区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲3级| 久久精品久久久久久 | 色爱综合网 | 欧美视频二区 | 精品国产aⅴ | 一区二区三区四区国产 | 天天影视网天天综合色在线播放 | 在线不卡| 国产日韩欧美精品一区二区三区 | 久久综合影院 | 精品毛片在线观看 | 91精品综合久久久久久五月天 | 在线中文视频 | 色噜噜狠狠色综合中国 | 欧美成视频 | 欧美精品在线免费观看 | 91精品国模一区二区三区 | 国产精品jizz在线观看老狼 | 日本成人福利 | 色一情一乱一伦一区二区三区 | 精品国产一区二区三区av片 | 精品av|