簡體   English   中英

通用 rest 參數中的自約束元素

[英]Self constrained elements in generic rest parameter

Typescript 可以推斷受數組類型約束的通用 rest 參數的元組類型。 但這在我的情況下不起作用。 我正在嘗試傳遞一系列對[function, argument]並想對該參數進行類型檢查,並且 function 類型是否匹配。 可能嗎?

type User = {
    name: string
    age: number
}

function eatNumber(a: number) { }
function eatString(a: string) { }
function eatUser(a: User) { }

type FuncAndArg<F extends (arg: any) => void> = [F, Parameters<F>[0]]

function callMany<F extends (arg: any) => void, T extends FuncAndArg<F>[]>(...pairs: T) { }

const jack = {
    name: 'jack',
    age: 23
}

//argument type not checked
callMany([eatNumber, jack], [eatString, jack], [eatUser, jack])

是的,您可以使用 rest arguments 執行此操作。 我表示這一點的方式是使用一個通用元組來表示callMany()的每個參數中的第二pairs元素的類型,將對參數指定為映射元組類型,並依賴映射類型的推斷讓編譯器推斷T . 像這樣:

function callMany<T extends any[]>(
  ...pairs: { [I in keyof T]: [(a: T[I]) => any, T[I]] }
) { }

然后你可以像這樣使用它:

callMany([eatNumber, jack], [eatString, jack], [eatUser, jack]); // error!
//        ~~~~~~~~~ <-- User not assignable to number

callMany([eatNumber, 23], [eatString, jack], [eatUser, jack]); // error!
//                          ~~~~~~~~~ <-- User not assignable to string

callMany([eatNumber, 23], [eatString, "jack"], [eatUser, jack]); // okay

看起來像你想要的。 好的,希望有幫助。 祝你好運!

鏈接到代碼

暫無
暫無

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

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