簡體   English   中英

鍵入 function 以通過 Record 調度函數

[英]Typed function for dispatching functions through a Record

const dispatch = {
  'A': (arg: { a0: number }) => { },
  'B': (arg: { b0: string, b1: number }) => { }
}

function Dispatcher<???>(key: ???, arg: ???) {
  dispatch[key](arg); 
}
function Dispatcher2<K extends keyof typeof dispatch>
(key: K, arg: Parameters<typeof dispatch[K]>[0]) {
    dispatch[key](arg);// passing arg fails type checking
}

操場

有幾種方法可以只允許keyarg的正確組合進入Dispatcher 但是,我永遠無法讓 TypeScript 理解將arg傳遞到 function 調用中是可以的。

有沒有辦法做到這一點?

這個問題可以歸入“關聯並集”問題的范疇。 當使用key索引dispatch時,編譯器計算函數的並集,該函數只能通過所有參數的交集調用。 dispatch[key]arg之間的關系基本上丟失了。

但是有一種特定的方法可以重寫PR#47109中描述的類型,以使編譯器理解相關性。

我們必須更改dispatch的類型,以便它使用映射類型 DispatchRecord類型充當參數類型的查找類型。

type DispatchRecord = { 
  A: { a0: number }
  B: { b0: string, b1: number }
}

const dispatch: { 
  [K in keyof DispatchRecord]: (arg: DispatchRecord[K]) => void 
} = {
  'A': (a) => { },
  'B': (b) => { }
}

function 本身在K上保持通用。 要鍵入keyarg ,我們使用 rest 參數。 rest 參數的類型是映射類型,它計算由兩個元素組成的元組,一個用於key ,一個用於arg 然后,此映射類型由K索引。

function Dispatcher<K extends keyof DispatchRecord>(...[key, arg]: {
  [P in K]: [P, DispatchRecord[P]]
}[K]) {
    dispatch[key](arg)
}

操場

暫無
暫無

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

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