簡體   English   中英

TypeScript 類型推斷與查找類型和開關盒

[英]TypeScript type inference with lookup types and switch case

我有以下 TypeScript 代碼:

type Test = {
    a: string;
    b: boolean;
    c: number;
}
const instance: Test = {
    a: 'a',
    b: true,
    c: 2,
}

function getValue<T extends keyof Test>(val: T): Test[T] {
    return instance[val];
}

function setValue<T extends keyof Test>(key: T, value: Test[T]): void {
    instance[key] = value;

    onChangeValue(key, value);
}

function onChangeValue<T extends keyof Test>(key: T, value: Test[T]): void {
    switch (key) {
        case 'a':
            let a: string = value; // why TS won't infer that value must be type Test['a'] ie. string? Is there any way to fix it?
        break;
        case 'b':
            let b: boolean = value;
        break;
        case 'c':
            let c: number = value;
        break
    }
}

let d: number = getValue('c'); // works fine

setValue('a', 'fsdfdsf'); // works fine

所以基本上我的方法接受一個參數,它是對象(類型)中的鍵,第二個是在 object 中設置該鍵的值的值。 我在這里使用基於傳遞鍵值的查找類型。 它適用於使用基於鍵返回值並基於鍵設置值的方法。 但是我有第三個 function onChangeValue在其中我想根據關鍵參數的類型識別值參數的類型。 為什么它在這里不起作用? 為什么編譯器不能正確推斷值參數的類型? 有沒有辦法修復它並使其在沒有顯式類型轉換的情況下工作?

正如@jcalz 在他們的評論中指出的那樣, onChangeValue的類型並不意味着value的類型是特定的類型。

例如,當你像這樣聲明一個常量k時,它的類型變為'a' | 'b' 'a' | 'b'

const k: 'a' | 'b' = true ? 'a' : 'b' as const

然后當你用k調用onChangeValue時, onChangeValue的類型將被實例化為function onChangeValue<'a' | 'b'>(key: 'a' | 'b', value: string | boolean): void function onChangeValue<'a' | 'b'>(key: 'a' | 'b', value: string | boolean): void

onChangeValue(k, true);

如您所見,即使key'a'value也可以是boolean 這就是為什么編譯器不會縮小switchvalue的類型。

暫無
暫無

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

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