Mam następujący interfejs:

interface FooBar {
    foo: string;
    bar: number; 
}

Czy istnieje sposób, dynamicznie tworzy typ, który akceptuje "foo" lub "bar"?

Lubić:


const update = (obj: FooBar, key: string, value: string | number) => {
   ...
}

W takim przypadku zamiast string | number chciałbym wyodrębnić wartości z FooBar, więc nie muszę aktualizować dwóch miejsc naraz

Jakieś pomysły? Dzięki tak daleko

0
Lhew 8 październik 2020, 16:30

1 odpowiedź

Najlepsza odpowiedź

Możesz wykonać kluczowy parametr generyczny, a następnie indeks interfejsu:

function update<K extends keyof FooBar> (obj: FooBar, key: K, value: FooBar[K]) {
  obj[key] = value
}

update(obj, 'bar', 10) // OK
update(obj, 'foo', 'x') // OK

update(obj, 'foo', 10) // Error
// --------------> ~~ 
// Argument of type 'number' is not assignable to parameter of type 'string'.
3
ccarton 8 październik 2020, 16:02