在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML5  HTML/ typescript 泛型內(nèi)的 `=` 賦值操作是什么意思?

typescript 泛型內(nèi)的 `=` 賦值操作是什么意思?

描述

舉個 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類型的約束條件”

問題

  1. <TElement extends Element = HTMLElement>, 這里的 = HTMLElement 的意義是什么 ?
  2. 這里的=賦值像是函數(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

2017年1月4日 23:17