[英]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 操場在這里。
當我調用caller
和callerB
時, 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 中的類型參數在收到通用類型參數后擴展),這意味着K
是keyof Vehicle
而不是您所追求的特定鍵。 MapperB
類型不是泛型,而是有一個泛型的 function,這意味着在 function 調用上擴展了類型變量,這意味着可以將K
調整為Vehicle
的特定鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.