舉個 jQuery 聲明文件 的 栗子
interface JQueryStatic {
// ...
<TElement extends Element = HTMLElement>(selector: JQuery.Selector, context?: Element | Document | JQuery): JQuery<TElement>;
}
如果是 <TElement extends Element>(selector: JQuery.Selector, context?: Element | Document | JQuery): JQuery<TElement> , 我理解大概是說:“可以傳入一個泛型參數(shù) TElement,且 TElement 需要滿足 Element類型的約束條件”
<TElement extends Element = HTMLElement>, 這里的 = HTMLElement 的意義是什么 ?
這里的=賦值像是函數(shù)參數(shù)默認值,代表泛型的默認值么? 但是,由官方栗子可知,類型推論會自動確定確認 T 的類型,應(yīng)該是不需要泛型的默認值的吧?
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString"); // type of output will be 'string'
// 利用了類型推論 -- 即編譯器會根據(jù)傳入的參數(shù)自動地幫助我們確定T的類型
let output2 = identity("myString"); // type of output will be 'string'
就是泛型的默認值。
閣下引用的例子里寫到
編譯器會根據(jù)傳入的參數(shù)自動地幫助我們確定T的類型
而在JQueryStatic里,傳入的參數(shù)與TElement一毛錢關(guān)系都沒有,換言之,是無法自動推斷的。在這種時候,就可以指定一個默認值。
題主引用的例子里寫的是“傳入的參數(shù)”,所以我也就沿用了這個不嚴謹?shù)谋磉_,但是看起來導(dǎo)致困惑了……
這里的“傳入的參數(shù)”,指的是圓括號里的東西,即函數(shù)的形參。如果圓括號里面沒有出現(xiàn)過TElement,那么就不可能根據(jù)調(diào)用時的實參去自動推斷泛型。至于泛型的約束條件,可以與默認值同時出現(xiàn),也可以不同時出現(xiàn),兩者沒有必然的聯(lián)系。
嚴格來說,“傳入”這個詞和“泛型參數(shù)”這個詞是不能搭配的。泛型是定義時使用的,運行時會被去掉。
再補上例子吧:
function bare<TElement>(): TElement {
return null as any as TElement;
}
const a = bare(); // typeof a === {}
function ext<TElement extends Element>(): TElement {
return null as any as TElement;
}
const b = ext(); // typeof b === Element
function dft<TElement extends Element = HTMLElement>(): TElement {
return null as any as TElement;
}
const c = dft(); // typeof c === HTMLElement
以上圓括號里面都沒有出現(xiàn)過TElement。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。