簡體   English   中英

(TypeScript) 從函數參數類型創建類型

[英](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.

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