TS中的泛型

一桃笙、泛型是什么?有什么作用
當我們定義一個變量不確定類型的時候有兩種解決方式:
1.使用any

使用any定義時存在的問題:雖然 以 知道傳入值的類型但是無法獲取函數(shù)返回值的類型岔霸;另外也失去了ts類型保護的優(yōu)勢

2.使用泛型

泛型指的是在定義函數(shù)/接口/類型時保檐,不預(yù)先指定具體的類型锋拖,而是在使用的時候在指定類型限制的一種特性街夭。

二焊切、泛型用法
1.在函數(shù)中使用泛型

function test <T> (arg:T):T{
  console.log(arg);
  return arg;
}
test<number>(111);// 返回值是number類型的 111
test<string | boolean>('hahaha')//返回值是string類型的 hahaha
test<string | boolean>(true);//返回值是布爾類型的 true

使用方式類似于函數(shù)傳參扮授,傳什么數(shù)據(jù)類型,T就表示什么數(shù)據(jù)類型专肪, 使用表示刹勃,T也可以換成任意字符串。

2.在接口中使用泛型
// 注意嚎尤,這里寫法是定義的方法哦

interface Search {
  <T,Y>(name:T,age:Y):T
}

let fn:Search = function <T, Y>(name: T, id:Y):T {
  console.log(name, id)
  return name;
}
fn('li',11);//編譯器會自動識別傳入的參數(shù)荔仁,將傳入的參數(shù)的類型認為是泛型指定的類型
  1. 在類中使用泛型
class Animal<T> {
 name:T;
 constructor(name: T){
  this.name = name;
 }
 action<T>(say:T) {
   console.log(say)
 }
}
let cat = new Animal('cat');
cat.action('mimi')

三、泛型約束
1.使用接口約束泛型

interface Person {
  name:string;
  age:number;
}
function student<T extends Person>(arg:T):T {
  return arg;
}

student({name:'lili'});//類型 "{ name: string; }" 中缺少屬性 "age"芽死,但類型 "Person" 中需要該屬性
student({ name: "lili" , age:'11'});//不能將類型“string”分配給類型“number”
student({ name: "lili" , age:11});

2.數(shù)組泛型
let arr:Array<number> =[1,2,3] === let arr:number[]=[1,2,3]

四乏梁、泛型工具類型
1.Partial

partial<T>的作用就是將某個類型中的屬性全部變?yōu)榭蛇x項?
示例:
interface Person {
  name:string;
  age:number;
}
function student<T extends Person>(arg: Partial<T>):Partial<T> {
  return arg;
}

2.Record

Record<K extends keyof any, T>的作用是將K中所有的屬性轉(zhuǎn)換為T類型;示例:
interface PageInfo {
  title: string
}
type Page = 'home'|'about'|'other';
const x: Record<Page, PageInfo> = {
  home: { title: "xxx" },
  about: { title: "aaa" },
  other: { title: "ccc" },
};

3.Pick

Pick<T, K extends keyof T>的作用是將某個類型中的子屬性挑出來关贵,變成包含這個類型部分屬性的子類型遇骑,示例:
interface Todo {
  title:string,
  desc:string,
  time:string
}
type TodoPreview = Pick<Todo, 'title'|'time'>;
const todo: TodoPreview ={
  title:'吃飯',
  time:'明天'
}

4.Exclude

Exclude<T,U>的作用是將某個類型中屬于另一個類型的屬性移除掉,示例:

type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
const t:T0 ='b';

5.ReturnType

returnType<T>的作用是用于獲取函數(shù)T的返回類型揖曾,示例:

type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<(s: string) => void>; // void
type T2 = ReturnType<<T>() => T>; // {}
type T3 = ReturnType<<T extends U, U extends number[]>() => T>; // number[]
type T4 = ReturnType<any>; // any
type T5 = ReturnType<never>; // any
type T6 = ReturnType<string>; // Error
type T7 = ReturnType<Function>; // Error
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末质蕉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翩肌,更是在濱河造成了極大的恐慌模暗,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件念祭,死亡現(xiàn)場離奇詭異兑宇,居然都是意外死亡,警方通過查閱死者的電腦和手機粱坤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門隶糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷产,“玉大人,你說我怎么就攤上這事枚驻”舻” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵再登,是天一觀的道長尔邓。 經(jīng)常有香客問我,道長锉矢,這世上最難降的妖魔是什么梯嗽? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮沽损,結(jié)果婚禮上灯节,老公的妹妹穿的比我還像新娘。我一直安慰自己绵估,他們只是感情好炎疆,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著国裳,像睡著了一般形入。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躏救,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音螟蒸,去河邊找鬼盒使。 笑死,一個胖子當著我的面吹牛七嫌,可吹牛的內(nèi)容都是我干的少办。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼诵原,長吁一口氣:“原來是場噩夢啊……” “哼英妓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绍赛,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蔓纠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吗蚌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腿倚,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年蚯妇,在試婚紗的時候發(fā)現(xiàn)自己被綠了敷燎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂筝。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硬贯,靈堂內(nèi)的尸體忽然破棺而出焕襟,到底是詐尸還是另有隱情,我是刑警寧澤饭豹,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布鸵赖,位于F島的核電站,受9級特大地震影響墨状,放射性物質(zhì)發(fā)生泄漏卫漫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一肾砂、第九天 我趴在偏房一處隱蔽的房頂上張望列赎。 院中可真熱鬧,春花似錦镐确、人聲如沸包吝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诗越。三九已至,卻和暖如春息堂,著一層夾襖步出監(jiān)牢的瞬間嚷狞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工荣堰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留床未,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓振坚,卻偏偏與公主長得像薇搁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渡八,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 泛型是指在定義函數(shù)啃洋、接口或類的時候,不預(yù)先指定具體的類型屎鳍,而在使用的時候再指定類型的一種特性宏娄。 定義函數(shù)時的使用 ...
    Li菜鳥閱讀 1,160評論 0 1
  • 泛型可以理解為寬泛的類型,通常用于類和函數(shù) 一逮壁、泛型類 泛型可以用于類和構(gòu)造器绝编,例如: 如上,<T>表示傳遞一個T...
    深度剖析JavaScript閱讀 29,514評論 1 17
  • <T> 泛型的作用:編寫的時候不確定類型,當調(diào)用時確定類型 1. 單個泛型 聲明的時候需要用 <> 包裹起來 2....
    Frog_He閱讀 724評論 0 0
  • Java泛型基礎(chǔ) 1. 認識泛型 泛型是在JDK1.5之后增加的新功能. 泛型可以解決數(shù)據(jù)的安全性問題, 主要的原...
    Java丶python攻城獅閱讀 153評論 0 0
  • 參考C# 泛型 泛型與非泛型集合[http://www.reibang.com/p/e45e7573f928]一...
    合肥黑閱讀 736評論 0 2