th:text為null報錯_為vue3.0的學習TS解讀高級類型

知識點摘要

本節課主要關鍵詞為:?自動類型推斷?/?類型斷言?/?類型別名(type)?/?映射類型(Pick/Record等...)?/?條件類型(extends)?/?類型推斷(infer)

自動類型推斷(不用你標類型了,ts自己猜)

?大家現在寫ts的時候一定會在每個變量后面都加上類型吧? 但是?

現在告訴大家有些情況下你不需要標注類型, ts可以根據你寫的代碼來自動推斷出類型:

賦值字面量給變量

let n = 1; // ts會自動推斷出n是number類型
n+=3 // 不報錯,因為已知類型

let arr1 = []; // 類型為: any[]
arr1.push(1,2,{o:3});

let arr = [1]; // 內部要有數字, 才能推斷出正確類型
arr.push(2);

自動閱讀if條件判斷
let n: number|null = 0.5 < Math.random() ? 1:null;
if(null !== n){
n+=3 // ts知道現在n不是null是number
}
瀏覽器自帶api
document.ontouchstart = ev=>{ // 能自動推斷出ev為TouchEvent
console.log(ev.touches); // 不報錯, TouchEvent上有touches屬性
}
typeof

typeof就是js中的typeof, ts會根據你代碼中出現的typeof來自動推斷類型:

let n:number|string = 0.5 < Math.random()? 1:'1';

// 如果沒有typeof, n*=2會報錯, 提示沒法推斷出當前是number類型, 不能進行乘法運算
if('number' === typeof n) {
n*= 2;
} else {
n= '2';
}

注意: 在ts文檔中, 該部分的知識點叫做typeof類型保護, 和其他類型推斷的內容是分開的, 被寫在高級類型/類型保護章節中.

instanceof

ts會根據你代碼中出現的instanceof來自動推斷類型:

let obj = 0.5 < Math.random() ? new String(1) : new Array(1);
if(obj instanceof String){
// obj推斷為String類型
obj+= '123'
} else {
// obj為any[]類型
obj.push(123);
}

注意: 在ts文檔中, 該部分的知識點叫做instanceof類型保護, 和其他類型推斷的內容是分開的, 被寫在高級類型/類型保護章節中.

類型斷言(你告訴ts是什么類型, 他都信)

有些情況下系統沒辦法自動推斷出正確的類型, 就需要我們標記下, 斷言有2種語法, 一種是通過"<>", 一種通過"as", 舉例說明:

let obj = 0.5 < Math.random() ? 1 : [1]; // number|number[]

// 斷言, 告訴ts, obj為數組
(<number[]>obj).push(1);

//等價
(obj as number[]).push(1);

類型別名(type)

類型別名可以表示很多接口表示不了的類型, 比如字面量類型(常用來校驗取值范圍):

type A = 'top'|'right'|'bottom'|'left'; // 表示值可能是其中的任意一個
type B = 1|2|3;
type C = '紅'|'綠'|'黃';
type D = 150;

let a:A = 'none'; // 錯誤, A類型中沒有'none'
更多組合:
interface A1{
a:number;
}
type B = A1 | {b:string};
type C = A1 & {b:string};

// 與泛型組合
type D<T> = A1 | T[];

索引類型(keyof)

js中的Object.keys大家肯定都用過,?獲取對象的鍵值, ts中的keyof和他類似, 可以用來獲取對象類型的鍵值:

type A = keyof {a:1,b:'123'} // 'a'|'b'
type B = keyof [1,2] // '1'|'2'|'push'... , 獲取到內容的同時, 還得到了Array原型上的方法和屬性(實戰中暫時沒遇到這種需求, 了解即可)

可以獲得鍵值, 也可以獲取對象類型的值的類型:

type C = A['a'] // 等于type C = 1;
let c:C = 2 // 錯誤, 值只能是1

映射類型(Readonly, Pick, Record等...)

映射類型比較像修改類型的工具函數, 比如Readonly可以把每個屬性都變成只讀:

type A  = {a:number, b:string}
type A1 = Readonly<A> // {readonly a: number;readonly b: string;}

打開node_modules/typescript/lib文件夾可以找到lib.es5.d.ts, 在這我們能找到Readonly的定義:

type Readonly<T> = {
readonly [P in keyof T]: T[P];
};

其實不是很復雜, 看了本節課前面前面的內容, 這個很好理解是吧:

  1. 定義一個支持泛型的類型別名, 傳入類型參數T.

  2. 通過keyof獲取T上的鍵值集合.

  3. in表示循環keyof獲取的鍵值.

  4. 添加readonly標記.

Partial, 讓屬性都變成可選的
type A  = {a:number, b:string}
type A1 = Partial<A> // { a?: number; b?: string;}
Required, 讓屬性都變成必選
type A  = {a?:number, b?:string}
type A1 = Required<A> // { a: number; b: string;}
Pick, 只保留自己選擇的屬性, U代表屬性集合
type A  = {a:number, b:string}
type A1 = Pick<A, 'a'> // {a:number}
Omit 實現排除已選的屬性
type A  = {a:number, b:string}
type A1 = Omit<A, 'a'> // {b:string}
Record, 創建一個類型,T代表鍵值的類型, U代表值的類型
type A1 = Record<string, string> // 等價{[k:string]:string}
Exclude, 過濾T中和U相同(或兼容)的類型
type A  = {a:number, b:string}
type A1 = Exclude<number|string, string|number[]> // number

// 兼容
type A2 = Exclude<number|string, any|number[]> // never , 因為any兼容number, 所以number被過濾掉
Extract, 提取T中和U相同(或兼容)的類型
type A  = {a:number, b:string}
type A1 = Extract<number|string, string|number[]> // string
NonNullable, 剔除T中的undefined和null
type A1 = NonNullable<number|string|null|undefined> // number|string
ReturnType, 獲取T的返回值的類型
type A1= ReturnType<()=>number> // number
InstanceType, 返回T的實例類型

ts中類有2種類型, 靜態部分的類型和實例的類型, 所以T如果是構造函數類型, 那么InstanceType可以返回他的實例類型:

interface A{
a:HTMLElement;
}

interface AConstructor{
new():A;
}

function create (AClass:AConstructor):InstanceType<AConstructor>{
return new AClass();
}
Parameters 獲取函數參數類型

返回類型為元祖, 元素順序同參數順序.

interface A{
(a:number, b:string):string[];
}

type A1 = Parameters<A> // [number, string]
ConstructorParameters 獲取構造函數的參數類型

Parameters類似, 只是T這里是構造函數類型.

interface AConstructor{
new(a:number):string[];
}

type A1 = ConstructorParameters<AConstructor> // [number]

extends(條件類型)

T extends U ? X : Y

用來表示類型是不確定的, 如果U的類型可以表示T, 那么返回X, 否則Y. 舉幾個例子:

type A =  string extends '123' ? string :'123' // '123'
type B = '123' extends string ? string :123 // string

明顯string的范圍更大,?'123'可以被string表示, 反之不可.

infer(類型推斷)

單詞本身的意思是"推斷", 實際表示在extends條件語句中聲明待推斷的類型變量. 我們上面介紹的映射類型中就有很多都是ts在lib.d.ts中實現的, 比如Parameters:

type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;

上面聲明一個P用來表示...args可能的類型, 如果(...args: infer P)可以表示?T, 那么返回...args對應的類型, 也就是函數的參數類型, 反之返回never.

注意:?開始的T extends (...args: any) => any用來校驗輸入的T是否是函數, 如果不是ts會報錯, 如果直接替換成T不會有報錯, 會一直返回never.

應用infer

接下來我們利用infer來實現"刪除元祖類型中第一個元素", 這常用于簡化函數參數

export type Tail<Tuple extends any[]> = ((...args: Tuple) => void) extends ((a: any, ...args: infer T) => void) ? T : never

---END---

選擇”Vue社區?“星標?,內容一觸即達。點擊原文更多驚喜!

開發者技術前線?匯集技術前線快訊和關注行業趨勢,大廠干貨,是開發者經歷和成長的優秀指南。

歷史推薦

7個有用的Vue開發技巧

JavaScript八張思維導圖

JavaScript 之實現一個簡單的 Vue

080452923335ebfcb41e934e8c1a6e44.png

聽說有人不敢點這里 ?

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

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

相關文章

Hive與Hadoop的調用關系

一、調用圖 二、步驟解析 1、提交sql 交給驅動 2、驅動編譯&#xff1a;解析相關的字段表信息 3、去metastore查詢相關的信息 返回字段表信息 4、編譯返回信息 發給驅動 5、驅動發送一個執行計劃 交給執行引擎 6、執行計劃 6.1、DDLs 對數據庫表的操作的 直接和metastore交互 …

shell發送郵件函數

#發送郵件函數function send_mail(){ #定義郵件發送列表 maillist( zhengwei.liuxxx xiaogang.yangxxx sundy.shexxx ) #根據不同的函數參數&#xff0c;發送不同的郵件 if [ "$1" "gateway" ];thenfor mail in ${maillist[*]};doecho "無法ping通網…

列主元消去法例題詳解_高斯列主元消元法解方程組的步驟

高斯列主元消元法求解線性方程組AXb的簡要步驟??????????????????????????????????????nnnnnnnnbbbxxxaaaaaaaaa?????????2121212222111211方法說明(以4階為例)&#xff1a;?第1步消元——在增廣矩陣(A&#xff0c;b)第一列中…

Hive的使用之控制臺

啟動方式 1、如果將hive的bin&#xff08;/home/hive2.1/bin&#xff09;配置了環境變量&#xff0c;則輸入&#xff1a;hive。 2、 #hive --service cli 啟動 退出方式 1、hive>quit; 2、ctrlc 實例 ---------hivesql兼容大部分sql------- hive>show tables; hiv…

簡述計算機文件的命名辦法,如何進行文件命名-如何進行文件管理

如何進行文件命名-如何進行文件管理電腦的管理事實上就是文件和文件夾的管理。想要我們的電腦干凈整齊&#xff0c;就需要我們正確的進行文件管理。我們知道了文件和文件夾的概念之后&#xff0c;現在我們再來看看單獨的文件&#xff0c;認識一下文件的構成以及文件命名和命名規…

網頁加載出現沒有合適的負載均衡器_分布式必知必會-七層負載和四層負載到底是什么?...

背景我們在使用負載均衡器的時候&#xff0c;往往會聽到七層負載或四層負載這兩個名詞&#xff0c;許多負載均衡軟件提供的方式也不同&#xff0c;那么七層和四層區別在哪呢&#xff1f;為什么有的支持有的不支持呢&#xff1f;負載均衡簡介負載均衡建立在現有網絡結構之上&…

博弈論 斯坦福game theory stanford week 3.2_

title: 博弈論 斯坦福game theory stanford week 3-1 tags: note notebook: 6- 英文課程-15-game theory --- 博弈論 斯坦福game theory stanford week 3-1 習題 第 1 個問題 We say that a game is dominance solvable, if iterative deletion of strictly dominated strategi…

redis 值字符串前面部分亂碼_redis key亂碼

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":9,"count":9}]},"card":[{"des":"兼容Redis協議標準的、提供持久化的內存數據…

Hive的使用之腳本文件

好處 在實際開發中&#xff0c;遇到復雜的hivesql&#xff0c;在文件里先寫好再執行&#xff0c;比直接在控制臺寫更高效&#xff0c;糾錯&#xff0c;修改更方便&#xff0c;也易于后期維護。 [hadoophello110 ~]$ 模式 在hive沒有啟動的時候&#xff0c;非hive內&#xff0c…

nestjs swagger文檔調用需要鑒權的接口

目標 nestjs經常需要設置一些鑒權&#xff08;登錄后&#xff09;才能訪問的接口&#xff0c;但是生成的swagger文檔可以發起接口請求&#xff0c;文檔發起的請求默認是不攜帶登錄token的&#xff0c;所以需要移除swagger文檔發起請求的守衛攔截。 nestjs守衛攔截設置見另一篇…

ajax預加載html seo,前端性能優化 — JS預加載和懶加載

JS預加載需求&#xff1a;有時我們需要實現例如快速快速切換頁面、圖片之類的功能時&#xff0c;能盡快的加載出我們所需的圖片會極大提升用戶體驗&#xff0c;這時用預加載將圖片先緩存到瀏覽器&#xff0c;用戶使用需顯示圖片時無疑會順暢很多。核心&#xff1a;當一個圖片在…

面向對象、繼承、抽象方法重載知識點整理

面向過程、面向對象 面向過程&#xff1a;從開始到結束自己獨立完成 面向對象&#xff1a;將一個事物劃分為單體來各自實現區域性的功能&#xff0c;最后通過調用組合完成 類、對象 類&#xff1a;某一些具有共同特征的物體 對象&#xff1a;指某一種具體的物體&#xff0c;屬于…

python for循環n次_Python入門10 —— for循環

1.字符串依次取值 students [egon, lxx, alex] i 0 while i < 3: print(students[i]) i 1 2.針對循環取值操作&#xff0c;while循環并不擅長&#xff0c;于是python提供一個專門循環取值操作&#xff1a;for循環 students [egon, lxx, alex] for x in students: # 有幾…

hive與依賴環境的交互

與linux交互命令 格式 在linux的命令前加上!&#xff08;英文感嘆號&#xff09;&#xff0c;以;&#xff08;英文分號結尾&#xff09; 操作實例 !ls; !pwd; hive> !ls; app derby.log hadoop-2.7.2.tar.gz jdk-8u73-linux-x64.tar.gz metastore_db t.sql hive> !pw…

和平精英顯示服務器人數太多,和平精英到底有多差 導致玩家紛紛國際服

原標題&#xff1a;和平精英到底有多差 導致玩家紛紛國際服和平精英上線以來爭議不斷&#xff0c;百分之九十九是對和平精英的各種不滿&#xff0c;還有百分之一是喜歡和平精英&#xff0c;認為刺激戰場已經免費給我們玩&#xff0c;讓騰訊虧了很多錢&#xff0c;現在和平精英上…

python中的wx_配置 Python的wxWidgets可視開發環境 | 學步園

注&#xff1a;轉載請注明出處 一、下載 Python 2.5.1 這一步是必須做的&#xff0c;下載 Python 語言的 SDK 下載地址(直接復制到迅雷)&#xff1a;點擊下載 下載完成后安裝 Python 2.5.1&#xff0c;注意安裝路徑中不要有空格&#xff0c;不然會引起一些問題。 二、下載 wxPy…

的write方法有哪些參數_向子進程傳遞大量數據的方法

如何傳遞大型數據給子進程昨天的一篇文章中&#xff0c;我們說到如果想向一個子進程傳輸多于32767個字符的數據&#xff0c;我們需要尋找其他的方法(而不是命令行參數)來實現。我們能想到的第一個方法是&#xff1a;WM_COPYDATA。當子進程創建并進入消息循環后&#xff0c;我們…

厲害了!中關村軟件園人工智能軍團有料有看點

人工智能已成為當下全球科技界的新熱點&#xff0c;中外競相攀登這座劃時代的科技高峰。上月&#xff0c;國務院印發《新一代人工智能發展規劃》&#xff0c;明確將人工智能作為未來國家重要的發展戰略。《規劃》提出前瞻布局新一代人工智能重大科技項目&#xff0c;到2030年中…

Hive的使用之hwi

概述 hwi是hive開發的網頁形式查看數據。方便非專業人士使用。 安裝步驟 1、下載hive源碼包 地址&#xff1a;http://apache.fayea.com/hive/ apache-hive-2.1.0-src.tar.gz 2、打包war 解壓apache-hive-2.1.0-src.tar.gz源碼包&#xff0c;進入到 C:\Users\zengmg\Deskto…

c 服務器傳輸大文件,cend.me:不須經過服務器,直接點對點的文件傳輸免費服務...

要傳送文件給遠程的手機、平板、電腦等設備&#xff0c;通常的做法就是先將文件上傳到服務器存放&#xff0c;然后再從服務器下載&#xff0c;這樣的做法看似合理&#xff0c;但如果上傳的同時就由遠程的設備來接收&#xff0c;不要經過服務器&#xff0c;這樣就能更節省上、下…