>[success] # 案例場景 導讀
~~~
function getParams(params:unknown){
return params
}
// 雖然傳入的參數是字符,確定知道返回類型也是字符串,但實際類型推導是unknown
// 并不能將unknown 根據傳入參數實時推導
getParams("1")
~~~

* 使用聯合類型來改造
~~~
function getParams(params:string|number){
return params
}
// 但是相對的類型也為聯合類型
getParams("1")
~~~

* 使用函數重載 -- 完美解決現在問題
~~~
function getParams(params: number):number
function getParams(params: string):string
function getParams(params: unknown) {
return params
}
getParams('1')
~~~

>[success] # 什么是泛型
~~~
1.泛型(Generics)是指在定義函數、接口或類的時候,不預先指定具體的
類型,而在使用的時候再指定類型的一種特性。
2.泛型指的是類型參數化,即將原來某種具體的類型進行參數化。和定義函數參數一樣,我們可以給泛型定義
若干個類型參數,并在調用時給泛型傳入明確的類型參數。設計泛型的目的在于有效約束類型成員之間的關系,
比如函數參數和返回值、類或者接口成員和方法之間的關系。
3.也就是說在使用時候可以規定類型,讓其動態起來,來解決上面的問題
~~~
>[info] ## 泛型用法
~~~
1.通過尖括號 <> 語法給函數定義一個泛型參數例如指定參數為T,在將T指定到要規定參數類型的參數,例如將上面實現
通過泛型表現
~~~
~~~
function getParams<T>(params: T):T {
return params
}
getParams<number>(1)
getParams<number>("1") // 報錯因為已經指定的類型為number了
~~~
>[danger] ##### 使用的時候 -- 指定類型可缺省
~~~
function getParams<T>(params: T):T {
return params
}
// 根據傳入參數類型自動推斷了 省略了指定類型
getParams("1")
~~~
~~~
function reflectArray<P>(param: P[]) {
return param;
}
const reflectArr = reflectArray([1, '1']); // reflectArr 是 (string | number)[]
~~~
>[danger] ##### 泛型傳入多個不同類型參數
~~~
1.泛型傳入多個不同類型參數
~~~
~~~
function getArray<T,U>(value1:T,value2:U,items:number = 5):Array<[T,U]>{
return new Array(items).fill([value1,value2])
}
getArray("1",1,1).forEach((items)=>{
console.log(items[0].length)
console.log(items[1].length) // 幫我們自動檢測數字沒有length 屬性
})
~~~
~~~
function reflectExtraParams<P, Q>(p1: P, p2: Q): [P, Q] {
return [p1, p2];
}
~~~
- TypeSprict -- 了解
- TS-- 搭建(一)webpack版本
- TS -- 搭建(二)直接使用
- TS -- 基本類型
- ts -- 類型推導和字面量類型
- ts -- 類型擴展和類型縮小
- ts -- any場景
- ts -- 使用unknown 還是 any
- ts -- any/never/unknown
- ts -- 斷言
- ts -- 類型大小寫疑惑
- ts -- 數組類型 [] 還是泛型疑惑
- TS -- 枚舉
- 外部枚舉
- TS -- 函數
- ts -- 重載作用
- ts -- 05 this is
- 解構
- TS -- 接口
- 繞過接口的多余參數檢查
- Interface 與 Type 的區別
- TS -- 類
- ts -- 類作為類型
- TS -- 交叉和聯合 類型
- ts -- 交叉類型
- ts -- 聯合類型
- ts -- 交叉和聯合優先級
- ts -- 類型縮減
- TS -- 什么是泛型
- ts -- 泛型函數表達式/函數別名/接口
- ts -- 泛型類
- ts -- extends 泛型約束
- ts -- 泛型new
- ts -- Ts的泛型
- TS -- 縮小類型詳解類型守衛
- TS -- 類型兼容性
- TS -- 命名空間與模塊化
- ts -- 模塊化
- ts -- 命名空間
- TS -- 工具方法
- Record -- 一組屬性 K(類型 T)
- Exclude -- 從聯合類型中去除指定的類
- Extract -- 聯合類型交集
- NonNullable -- 從聯合類型中去除 null 或者 undefined
- Partial -- 將所有屬性變為可選
- Required -- 所有屬性變為必填
- Readonly -- 所有屬性只讀
- Pick -- 類型中選取出指定的鍵值
- Omit -- 去除指定的鍵值