摘要:都支持嵌套寫法寫法寫法有趣的寫法常量的寫法與交叉數(shù)據(jù)類型用法獲取對(duì)象的屬性升級(jí)版用法這種的聯(lián)合類型可以使用來循環(huán)值只能為用法二和與字符串索引簽名進(jìn)行交互。
interface type 都支持嵌套寫法
// interface 寫法 interface Ip { name: string; child?: Ip; } let child: Ip = { name: "str", child: { name: "test" } }; // type 寫法 type Ip = { name: string; child?: Ip; }; let child: Ip = { name: "child", child: { name: "haha" } }; // 有趣的寫法 type LinkedList= T & { next: LinkedList }; // people = {name:"",next:{name:"",next:{...}}} interface Person { name: string; } var people: LinkedList ; var s = people.name; var s = people.next.name; var s = people.next.next.name; var s = people.next.next.next.name;
常量的寫法 與 交叉數(shù)據(jù)類型
interface I { name: "ccc"; } interface P { age: "bbb"; } var a: I & P = { name: "ccc", age: "bbb" };
keyof 用法
// 獲取對(duì)象的屬性 function pluck(o: T, names: K): T[K] { return o[names]; } // 升級(jí)版 function pluck1 (o: T, names: K[]): T[K][] { return names.map(item => o[item]); } // keyof用法 interface Personal { name: string; age: number; } //keyof Personal ==> "name" | "age" 這種的聯(lián)合類型 可以使用in來循環(huán) let ppp: keyof Personal = "name"; let ppp1: keyof Personal = "age"; let ppp2: keyof Personal = "ss"; // error 值只能為 name | age
keyof 用法二
keyof 和 T[K]與字符串索引簽名進(jìn)行交互。 如果你有一個(gè)帶有字符串索引簽名的類型,那么 keyof T 會(huì)是 string。 并且 T[string]為索引簽名的類型
interface Map1{ [key: number]: T; } let pp: keyof Map1 ; // pp 類型為number let pp4: Map1 [0]; // 返回的類型是string interface Map2 { [key: string]: T; } let pp1: keyof Map1 ; // pp1 類型為string let pp3: Map2 ["foo"]; // 返回的類型是number
keyof 用法 3 映射類型
// 通過這個(gè)類型生成一個(gè)只讀版本 in 內(nèi)部使用了for---in循環(huán) interface PersonPartial { name?: string; age?: number; } // 使用 type ReadonlyPersonPartial= { readonly [key in keyof PersonPartial]: PersonPartial[key] } let b: ReadonlyPersonPartial = { name: "string", age: 123 } type Map2 = { [key in keyof PersonPartial]?: T; } var a: Map2 = { name: "123", } // 封裝一些通用的版本 type BeNull = { [P in keyof T]:T[P] | null } type BeEmpty = { [P in keyof T]?:T[P] }
理解 extends in 相關(guān)的東西
interface a { name: string; age: number; } // T 相當(dāng)于上面有 name | age // [key in T] 循環(huán) name age ,每一個(gè)key就是name age 那么 a[name],a[age] j type b= { [key in T]: a[key] }; let c: b<"name" | "age"> = { name: "123", age: 12 };
內(nèi)置的 pick record exclude的理解 慢慢來吧
// pick 的作用是傳入一個(gè)接口,返回接口里面特定的字段類型 type Pick= { [P in K]: T[P]; }; interface b { name: string, age:number } let cc: Pick = { name: "cc", age:123 } // 傳入屬性,生成一個(gè)接口 生成一個(gè) name age 都是string的interface type Record = { [P in K]: T; }; let mmm: Record<"name" | "age", string> = { name: "ccc", age:"20" } // 排除相同的 extends 可以理解為 T 可以賦值給 U 可以賦值返回never 否則 返回 T type Exclude = T extends U ? never : T; interface a { name:string } interface b { name: string, age:number } interface c { name: string, age: number, hobby:any } // 這兩個(gè)東西表示出來了 是分開來搞的 首先 a extends b => a b extends b=>never 所以返回的是 a let nnn: Exclude // 返回 a let nnnn: Exclude // 返回 never a extends a => never b extends a b可以賦值給a 返回never let ccc: Exclude let b: a extends b ? number : string // a 不能賦值給 b 所以返回了string b的類型就是string let nnn:Exclude // 排除相同的過后 剩下的就是 ‘a(chǎn)ge’ "name"|"age" extends "name" 難道是 name extends name , age extends name 分開來的 先這樣理解吧 type mm = "number" | "age"; type nn = "age" let c: mm extends nn ? never : mm; // mm 不能賦值給 nn 所以返回值是 mm 并不是上面Exclude 返回的 age 這個(gè)可以理解為傳入泛型變量的時(shí)候ts 幫我們?nèi)パh(huán) extends(賦值了一下) // 取出相同的 type Extract = T extends U ? T : never; // T 可以賦值給 U的話 表示的是T中的字段 U中肯定都存在 返回了 U。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/104445.html
摘要:官方文檔高級(jí)類型優(yōu)先閱讀,建議閱讀英文文檔。關(guān)鍵字這個(gè)關(guān)鍵字是在版本引入的在條件類型語句中,該關(guān)鍵字用于替代手動(dòng)獲取類型。源碼解釋使用條件判斷完成示例官方作用該類型可以獲得函數(shù)的參數(shù)類型組成的元組類型。 學(xué)習(xí) TypeScript 到一定階段,必須要學(xué)會(huì)高階類型的使用,否則一些復(fù)雜的場景若是用 any 類型來處理的話,也就失去了 TS 類型檢查的意義。 本文羅列了 TypeScript...
摘要:直達(dá)第一課體驗(yàn)第二課基礎(chǔ)類型和入門高級(jí)類型第三課泛型第四課解讀高級(jí)類型第五課什么是命名空間回顧第二課的時(shí)候?yàn)榱烁玫闹v解基礎(chǔ)類型所以我們講解了一部分高級(jí)類型比如接口聯(lián)合類型交叉類型本節(jié)課我會(huì)把剩余高級(jí)類型都講完知識(shí)點(diǎn)摘要本節(jié)課主要關(guān)鍵詞為自 直達(dá) 第一課, 體驗(yàn)typescript 第二課, 基礎(chǔ)類型和入門高級(jí)類型 第三課, 泛型 第四課, 解讀高級(jí)類型 第五課, 什么是命名空間(na...
摘要:導(dǎo)航第一課體驗(yàn)第二課基礎(chǔ)類型和入門高級(jí)類型第三課泛型第四課解讀高級(jí)類型很重要這一節(jié)很重要可以說是的最核心部分這一節(jié)學(xué)完其實(shí)就可以開始用寫代碼了想想中的再看看標(biāo)題中的類型字所以請(qǐng)大家務(wù)必認(rèn)真什么是入門高級(jí)類型因?yàn)楦呒?jí)類型的內(nèi)容比較多但是有些基 導(dǎo)航 第一課, 體驗(yàn)typescript 第二課, 基礎(chǔ)類型和入門高級(jí)類型 第三課, 泛型 第四課, 解讀高級(jí)類型 很重要 這一節(jié)很重要, 可以說...
摘要:會(huì)報(bào)錯(cuò),因?yàn)橹袥]有暴露此方法,可以最大限度的避免拼寫錯(cuò)誤在此之前,先看一個(gè)的錯(cuò)誤處理流程,以下是對(duì)進(jìn)行集中處理,并且標(biāo)識(shí)的過程在處,會(huì)編譯出錯(cuò),提示。 用了一段時(shí)間的 typescript 之后,深感中大型項(xiàng)目中 typescript 的必要性,它能夠提前在編譯期避免許多 bug,如很惡心的拼寫問題。而越來越多的 package 也開始使用 ts,學(xué)習(xí) ts 已是勢在必行。 以下是我在...
摘要:入門,第一個(gè)這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數(shù)式編程語言,它的代碼運(yùn)行在之上。它通過編輯類工具,帶來了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經(jīng)到來了,總結(jié)過去的 2017,相信小伙們一定有很多收獲...
閱讀 2603·2021-10-14 09:43
閱讀 3564·2021-10-13 09:39
閱讀 3295·2019-08-30 15:44
閱讀 3146·2019-08-29 16:37
閱讀 3711·2019-08-29 13:17
閱讀 2739·2019-08-26 13:57
閱讀 1831·2019-08-26 11:59
閱讀 1250·2019-08-26 11:46