函數(shù)與泛型

函數(shù)聲明

3.png

為函數(shù)定義類型

function hi(name:string): void {
  console.log(`hi ${name}`)
}

可選參數(shù)晌柬、默認參數(shù)质欲、類型推斷、剩余參數(shù)

function hi(name: string, age?:number):void {} // 可選參數(shù) age
function hi(name: string, age = 18): void{} // age 默認參數(shù)18 推斷age的類型為number
function hi(name:string, age:number = 19): string | number{} // 可以給默認參數(shù)類型祠丝。 返回string或者number


function buildName(firstName: string, ...restOfName: string[]) { // 剩余參數(shù)
  return firstName + " " + restOfName.join(" ");
}
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

泛型

function identity(arg: any): any { // 我們可以傳入number而返回string
    return arg;
}

我們需要一種方法使返回值的類型與傳入?yún)?shù)的類型是相同的
這里疾呻,我們使用了 類型變量除嘹,它是一種特殊的變量,只用于表示類型而不是值岸蜗。

function identity<T>(arg: T): T { // T幫助我們捕獲用戶傳入的類型
    return arg;
}

我們定義了泛型函數(shù)后尉咕,可以用兩種方法使用。 第一種是璃岳,傳入所有的參數(shù)年缎,包含類型參數(shù):

let output = identity<string>("myString");  // type of output will be 'string'

第二種方法更普遍。利用了類型推論 -- 即編譯器會根據(jù)傳入的參數(shù)自動地幫助我們確定T的類型:

let output = identity("myString");  // type of output will be 'string'

會出現(xiàn)如下的報錯铃慷, 我們使用了arg的.length屬性单芜,但是沒有地方指明arg具有這個屬性。 (泛型約束會提及

function loggingIdentity<T>(arg: T): T {
    console.log(arg.length);  // Error: T doesn't have .length
    return arg;
}

我們可以這樣(泛型約束會提及

function loggingIdentity<T>(arg: T[]): T[] {
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}

泛型接口

interface GenericIdentityFn {
    <T>(arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn = identity;
interface GenericIdentityFn<T> {
    (arg: T): T;
}

function identity<T>(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn<number> = identity;

泛型類

class GenericNumber<T> {
    zeroValue: T;
    add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

泛型約束

我們想訪問arg的length屬性犁柜,但是編譯器并不能證明每種類型都有l(wèi)ength屬性洲鸠,所以就報錯了。
創(chuàng)建一個包含 .length屬性的接口馋缅,使用這個接口和extends關(guān)鍵字來實現(xiàn)約束:

interface Lengthwise {
    length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length);  // Now we know it has a .length property, so no more error
    return arg;
}

現(xiàn)在這個泛型函數(shù)被定義了約束扒腕,因此它不再是適用于任意類型:

loggingIdentity(3);  // Error, number doesn't have a .length property

我們需要傳入符合約束類型的值,必須包含必須的屬性:

loggingIdentity({length: 10, value: 3});

重載

function add(a: number, b:number):number;
function add(a: string, b:string):string;
function add(a: any, b: any): any {
  return a + b
}

類型兼容

interface Named {
    name: string;
}

let x: Named;
let y = { name: 'Alice', location: 'Seattle' };
x = y;

Unsound 不完備的股囊。有瑕疵的袜匿。

enum EventType { Mouse, Keyboard }

interface Event { timestamp: number; }
interface MouseEvent extends Event { x: number; y: number }
interface KeyEvent extends Event { keyCode: number }

function listenEvent(eventType: EventType, handler: (n: Event) => void) {
    /* ... */
}

// Unsound, but useful and common
listenEvent(EventType.Mouse, (e: MouseEvent) => console.log(e.x + ',' + e.y));  // 有瑕疵的,但是不會報錯稚疹。mouseEvent是Event的子類型

// Undesirable alternatives in presence of soundness
listenEvent(EventType.Mouse, (e: Event) => console.log((<MouseEvent>e).x + ',' + (<MouseEvent>e).y)); // 使用了類型斷言
listenEvent(EventType.Mouse, <(e: Event) => void>((e: MouseEvent) => console.log(e.x + ',' + e.y))); // 這個看不懂

listenEvent(EventType.Mouse, (e: number) => console.log(e)); // 完全不一致所以會報錯
```



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祭务,隨后出現(xiàn)的幾起案子内狗,更是在濱河造成了極大的恐慌,老刑警劉巖义锥,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳沙,死亡現(xiàn)場離奇詭異,居然都是意外死亡拌倍,警方通過查閱死者的電腦和手機赂鲤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱恤,“玉大人数初,你說我怎么就攤上這事∨莺ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵寺谤,是天一觀的道長仑鸥。 經(jīng)常有香客問我眼俊,道長,這世上最難降的妖魔是什么环戈? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮迫悠,結(jié)果婚禮上巩梢,老公的妹妹穿的比我還像新娘创泄。我一直安慰自己,他們只是感情好括蝠,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布鞠抑。 她就那樣靜靜地躺著,像睡著了一般忌警。 火紅的嫁衣襯著肌膚如雪搁拙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天法绵,我揣著相機與錄音箕速,去河邊找鬼。 笑死朋譬,一個胖子當著我的面吹牛盐茎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徙赢,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼字柠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狡赐?” 一聲冷哼從身側(cè)響起窑业,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎阴汇,沒想到半個月后数冬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年拐纱,在試婚紗的時候發(fā)現(xiàn)自己被綠了铜异。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡秸架,死狀恐怖揍庄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情东抹,我是刑警寧澤蚂子,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站缭黔,受9級特大地震影響食茎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馏谨,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一别渔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惧互,春花似錦哎媚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逸绎。三九已至蕾域,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憔杨,已是汗流浹背匆赃。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工岗喉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炸庞。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像荚斯,于是被迫代替她去往敵國和親埠居。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

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