欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript條件類型示例全面講解

 更新時間:2023年07月14日 08:50:56   作者:。。。嗯  
這篇文章主要為大家介紹了TypeScript條件類型示例的全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Typescript 高階類型

索引類型

keyof 會提取interface中的key

class KeyCls {
name: string
age: number
}
type KeyClsExample1 = keyof KeyCls // name | age
function getParams(params: keyof KeyCls) {}
getParams('name') // 正常
getParams('age') // 正常
getParams('sex') // 報錯

in 可以遍歷枚舉類型

type Keys = 'a' | 'b'
type Obj = {
[p in Keys]: any;
}
// type Obj = {
//     a: any;
//     b: any;
// }

extends

type TExtends<T, U> = T extends U ? number : never;
type TExtendExample = TExtends<number, number | string> // number
// 聯(lián)合類型, 表示如果T中的類型是U的子集, 那么返回never, 否則返回T, 這個過程可以理解為對T中的類型進行一次遍歷, 每個類型都執(zhí)行一次extends
type NonNullable1<T, U> = T extends U ? never : T
type NonExample = NonNullable1<null | string, null | undefined> // string

Pick 英文意思挑選, 也就是從某種類型中挑選出一個或多個屬性

interface Todo {
title: string
desc: string
Done: boolean
}
type TodoPreview = Pick<Todo, 'Done'>
// type TodoPreview = {
//     Done: boolean;
// }
// 實現(xiàn)
type MyPick<T, K extends keyof T = keyof T> = {
[P in K]: T[P]
}
// K in extends keyof T = keyof T, 意思是取值必須是在T的key上面取, 如果不傳遞取值默認為keyof T,所有的key, 內(nèi)部取值是如果傳遞了K, 則屬性就在K中任意一個

Readonly 只讀

interface Todo {
title: string
desc: string
Done: boolean
}
const todo: Pick<Readonly<Todo>, 'title'> = {
title: '你好'
}
todo.title = '啊啊啊'; // 無法為“title”賦值,因為它是只讀屬性
// 實現(xiàn)
type myReadonly<T> = {
readonly [K in keyof T]: T[K]
}
// 分析: 通過keyof拿到所有的key屬性值組成聯(lián)合類型, 然后通過in遍歷類型,在屬性值前面加上readonly, 值value則是 T[K]
// 通過上面案例還可以實現(xiàn)可選類型
type myOptional<T> = {
[K in keyof T]?: T[K]
}

Exclude 語法: Exclude<T, U>, 返回 T 中不存在于 U 的部分

// 回顧extends
// // 聯(lián)合類型, 表示如果T中的類型是U的子集, 那么返回never, 否則返回T, 這個過程可以理解為對T中的類型進行一次遍歷, 每個類型都執(zhí)行一次extends
// type NonNullable1<T, U> = T extends U ? never : T
// type NonExample = NonNullable1<null | string, null | undefined> // string
// 自己實現(xiàn)Exclude
type myExclude<T, U> = T extends U ? never : T
// 測試
// 分析: 對T也就是'a'|'b'遍歷, a extends 'a'|'b', 返回never, 'b', 'a'|'c',返回'b', 所以上面的返回'b'
type excludeExample = myExclude<'a' | 'b', 'a' | 'c'> // 'b'

Partial 將傳入的屬性變?yōu)榭蛇x項

interface Todo {
title: string
desc: string
Done: boolean
}
type Partial<T> = {
[P in keyof T]?: T[P]
}
type KeyOfExample1 = Partial<Todo>
let keyofEx1: KeyOfExample1 = {
title: '1'
}

-? 將可選項代表的 ?去掉, 將該類型變成必選項, 與之對應的還有一個+?,是將可選項變成必選項

interface Todo {
title: string
desc: string
Done: boolean
}
type Mutable<T> = {
-readonly [P in keyof T]: T[P]
}
type mutableExample = Mutable<Readonly<Todo>>
// 將Todo變成可讀之后再變成可寫

Required 將傳入的屬性變成必選項

type Required<T> = {
[P in keyof T]-?: T[P]
}
class KeyCls {
name?: string;
age?: number;
}
const requiredExample: Required<KeyCls> = {
name: "John",
} // 報錯
const requiredExample2: Required<KeyCls> = {
name: "John",
age: 20,
} // 正常

Record<K, T> 將K中所有的屬性轉(zhuǎn)化為T類型

type myRecord<K extends keyof any, T> = {
[P in K]: T
}
enum Methods {
GET = "get",
POST = "post",
DELETE = "delete",
PUT = "put",
}
type IRouter = myRecord<Methods, (req: any, res: any) => void>
// type IRouter = {
//     get: (req: any, res: any) => void;
//     post: (req: any, res: any) => void;
//     delete: (req: any, res: any) => void;
//     put: (req: any, res: any) => void;
// }

Omit 排除某些字段

// 已經(jīng)學習了Pick和Exclude, 則可以利用這兩個實現(xiàn)Omit
class KeyCls {
name: string;
age: number;
}
// 假設(shè) T 為 KeyCls, K為name, 結(jié)果是 
// type myOmit<KeyCls, 'name'>
// {  
//    age: number;  
// }
// 只需要實現(xiàn)成這樣就行了, 也就是獲取到age
type myOmit<T, K extends keyof T> = Pick<T, 'age'>
// 排除name, 按照上面的 Exclude<'name' | 'age', 'name'> // 'age'
type myOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
// 測試
type myOmitExample = myOmit<KeyCls, "name">;
// type myOmitExample = {  
//     age: number;  
// }

NonNullable<T>:作用是去掉 T 中的 null 和 undefined。T 為字面量/具體類型的聯(lián)合類型

// 4.8版本之前
type NonNullable<T> = T extends null | undefined ? never : T;
// 4.8版本之后
type NonNullable<T> = T & {}

infer 可以推薦一個類型變量, 相當于生命一個類型變量, 這個變量的類型取決于傳入的泛型T

type F<T> = T extends () => infer R ? R : T;
type F1 = F<string> // string
type TObj<T> = T extends { name: infer V, age: infer U } ? V : T
type TObjExample2 = TObj<{
name: number;
age: string;
}>; // number;

ReturnType<T> 獲取函數(shù)返回值的類型

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
functin getUser() {
    return {
        name: 'xxx',
        age: 20
    }
}
type GetUserType = typeof getUser;
// type GetUserType = () => {
//   name: string;
//   age: number;
// }
type ReturnUser = ReturnType<GetUserType>
type ReturnUser = {
//   name: string;
//   age: number;
// }

以上就是TypeScript條件類型的詳細內(nèi)容,更多關(guān)于TypeScript條件類型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)圖片自適應(支持多圖)

    微信小程序?qū)崿F(xiàn)圖片自適應(支持多圖)

    這篇文章主要介紹了微信小程序如何實現(xiàn)圖片自適應的相關(guān)資料,文中介紹的方法同樣適應于多圖,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • js 獲取今天以及過去日期

    js 獲取今天以及過去日期

    這篇文章主要介紹了js獲得當前系統(tǒng)日期時間以及過去系統(tǒng)日期時間的方法,涉及javascript操作日期時間的相關(guān)技巧,示例代碼如下,需要的朋友可以參考下
    2017-04-04
  • TypeScript中的聯(lián)合類型使用示例詳解

    TypeScript中的聯(lián)合類型使用示例詳解

    這篇文章主要為大家介紹了TypeScript中的聯(lián)合類型使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • TypeScript與JavaScript的區(qū)別分析

    TypeScript與JavaScript的區(qū)別分析

    TypeScript可以使用JavaScript中的所有代碼和編程概念,TypeScript是為了使JavaScript的開發(fā)變得更加容易而創(chuàng)建的。推薦先精通JS的的前提下再學習TS,這樣更有利于同時學習兩門語言。
    2022-12-12
  • Manipulation-TypeScript?DOM操作示例解析

    Manipulation-TypeScript?DOM操作示例解析

    這篇文章主要為大家介紹了DOM?Manipulation-TypeScript?DOM操作示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 微信小程序?qū)崿F(xiàn)圖片預加載組件

    微信小程序?qū)崿F(xiàn)圖片預加載組件

    預加載圖片是提高用戶體驗的一個很好方法。圖片預先加載到瀏覽器中,訪問者便可順利地在你的網(wǎng)站上沖浪,并享受到極快的加載速度。下面這篇文章主要介紹了微信小程序?qū)崿F(xiàn)圖片預加載組件的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Typescript?轉(zhuǎn)換類型操作索引映射類型IIMT模式學習

    Typescript?轉(zhuǎn)換類型操作索引映射類型IIMT模式學習

    這篇文章主要為大家介紹了Typescript?轉(zhuǎn)換類型操作之索引映射類型IIMT模式學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Typescript是必須要學習嗎?如何學習TS全棧開發(fā)

    Typescript是必須要學習嗎?如何學習TS全棧開發(fā)

    Typescript目前在前端,網(wǎng)站,小程序中的位置基本無可替代,同時也可以構(gòu)建完美的CLI應用。在移動,桌面,后端方面,性能不是要求很高的情況下完全可以勝任,并且在區(qū)塊鏈,嵌入式,人工智能方面也開始茁壯成長。
    2022-12-12
  • TypeScript手寫一個簡單的eslint插件實例

    TypeScript手寫一個簡單的eslint插件實例

    這篇文章主要為大家介紹了TypeScript手寫一個簡單的eslint插件實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • typescript?type類型使用梳理總結(jié)

    typescript?type類型使用梳理總結(jié)

    這篇文章主要為大家介紹了typescript?type類型使用梳理總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論