[英](TypeScript) Create type from function argument type
我有以下代碼:
const Config = {
param1: 10,
param2: true,
};
type C = typeof Config;
function Func1<K extends keyof C>(a: { parameter: K; value: C[K] }) { }
現在,如果我調用Func1
如果我為參數使用了錯誤的類型,我會得到一個錯誤,例如:
Func1({ parameter: 'param2', value: 23 });
// ^ Error: not a boolean, we're good
題:
是否可以根據函數參數類型動態創建新類型,如下所示:
type T0<K extends keyof C> = {
parameter: K;
value: {
param1: number;
param2: boolean;
}[K];
}
function Func2<K extends keyof C>(a: T0<K>): void { }
Func2({ parameter: 'param2', value: 42 });
// ^ Error: not a boolean, we're good
在這里,我想根據函數參數類型動態創建類型T0
。
我嘗試了以下操作,但我沒有對第二個參數進行類型檢查:
function Func3(a: Parameters<typeof Func1>[0]): void { }
Func3({ parameter: 'param2', value: 23 });
// ^ No Error, we're NOT good
在這種情況下,參數的類型是:
a: {
parameter: "param1" | "param2";
value: number | boolean;
}
我仍然希望能夠根據第一個參數限制第二個參數的類型(在本例中為value
)。
所以換句話說,當我們使用type T1 = typeof Func1
,我們得到以下類型:
type T1 = <K extends "param1" | "param2">(a: {
parameter: K;
value: {
param1: number;
param2: boolean;
}[K];
}) => void
...是否有可能從上面的類型創建一個像下面這樣的新類型? :
type T0<K extends "param1" | "param2"> = {
parameter: K;
value: {
param1: number;
param2: boolean;
}[K];
}
不幸的是沒有。 Func1
是泛型的,TypeScript 目前無法推斷泛型類型。
函數類型參數被刪除到它們的約束中,我們從這些參數中推斷
使用Parameters<typeof Func1>
時也會發生同樣的情況。 Func1
參數被擦除到它們的約束(即value
變成value: number | boolean
)並返回此類型。
唯一的方法是像您已經這樣做的那樣顯式使用T0<K>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.