簡體   English   中英

typescript中function聲明的區別

[英]The difference of function declaration in typescript

假設我們有這樣的代碼:

interface Vehicle {
    bicycle(): string;
    car(wheel: number): void;
    bus(passanger: number): {
        name: string;
        age: number;
    }[];
}

type Mapper<K extends keyof Vehicle> = (funcName: K, callback: Vehicle[K]) => void;

interface MapperB {
    <K extends keyof Vehicle>(name: K, callback: Vehicle[K]): any;
}

declare const caller: Mapper<keyof Vehicle>;
declare const callerB: MapperB

或 typescript 操場在這里

當我調用callercallerB時, caller無法根據第一個參數推斷callback類型。 實際上,我發現沒有辦法存檔。 但是callerB做得很好。

caller("bicycle", () => {
    
})// can't give any intellisense

callerB('bus', (passanger) => {
    return [{
        name: 'Jack',
        age: 11
    }]
})// will give perfect hints according to first argument.

所以我想知道這兩個聲明之間有什么區別,它似乎不是一個錯誤。

一個是泛型類型,恰好是 function ( Mapper ),另一個是泛型 function ( MapperB )。

泛型類型在您聲明caller時指定其類型參數,因此在您調用caller時不會發生更多推斷。 K已經一成不變, K將成為聯合'bicycle' | 'car' | 'bus' 'bicycle' | 'car' | 'bus' 'bicycle' | 'car' | 'bus' 所以callback將被輸入為Vehicle['bicycle' | 'car' | 'bus'] Vehicle['bicycle' | 'car' | 'bus'] Vehicle['bicycle' | 'car' | 'bus']這將是Vehicle中所有 function 簽名的聯合,這可能對您想要的內容過於寬松。

調用 function 時,通用 function 指定(或推斷)其類型參數。 所以當時根據參數的類型決定K只是bus ,可以更准確的推斷出回調參數。

您可以使用類型別名聲明泛型 function,但泛型類型參數列表必須在 function 上而不是在類型上:

type Mapper = <K extends keyof Vehicle>(funcName: K, callback: Vehicle[K]) => void;

游樂場鏈接

您的Mapper類型是通用的,並返回非通用 function (function 中的類型參數在收到通用類型參數后擴展),這意味着Kkeyof Vehicle而不是您所追求的特定鍵。 MapperB類型不是泛型,而是有一個泛型的 function,這意味着在 function 調用上擴展了類型變量,這意味着可以將K調整為Vehicle的特定鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM