### 概念:在定義函數、接口和類的時候,不預先指定類型,在使用的時候再指定類型的一種特性
### 寫法:如:`fun<T>(arg : T)`
案例1:單個參數
```
定義一個方法,參數類型可選,T不是固定的,可以是任意的
function fun1<T>(arg : T):T{
return arg;
}
fun1<number>(111);//參數是數字
fun1<string>("111");//參數是字符串
```
案例2 : 多個泛型參數
```
function fun2<T,U>(a:T,b:U){
console.log(a , b);
}
fun2<string,number>("hello",1);
fun2<number[],string>([1,2,3],"hh");
```
案列3:返回對應參數的長度,前提條件:此參數的類型必須有這個屬性:如:string,array等類型
```
//此時T沒有length這個屬性,所以需要繼承對應的類型,或者自定義一個接口
function fun3<T >(a : T){
console.log(a.length);
}
```

解決方法:繼承對應類型的屬性(extends)
```
function fun3<T extends string | string[] | number[]>(a : T){
console.log(a.length);
}
fun3<string>("6666");//4
fun3<string[]>(["1","2"]);//2
fun3<number[]>([1,2,3]);//3
```
自定義一個接口,接口中有length這個屬性
```
interface Ilength{
length : number
}
function fun4<T extends Ilength>(a : T){
console.log(a.length);
}
fun4([1,2,3])
```