[英]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
。 這就是為什么編譯器不會縮小switch
中value
的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.