Получить ошибку TS2322: тип 'any' не может быть назначен типу 'never' - PullRequest
0 голосов
/ 26 июня 2019

Когда я делаю это, I get “ts-ignore - error TS2322: Type 'any' is not assignable to type 'never'

type Obj = {
  key1: number;
  key2: string;
  key3: string | null;
};
type Keys = keyof Obj;
function mutateObj(obj: Obj, key: Keys, value: any) {
  obj[key] = value;
}

Я получаю ошибку выше.Когда я удаляю ноль из key3, он работает нормально.если вы делаете key3?: string;, я получаю ту же ошибку.Я знаю, что делаю что-то не так, и это относится к нулевому / неопределенному типу, но не знаю, как решить.

Обновление: спасибо за реализацию.Фактический вариант использования находится внутри immer-редуктора в приложении реакции, и мне интересно, есть ли способ напечатать это без вспомогательной функции.(сейчас я использую функцию для изменения черновика в первом ответе. Большое спасибо! :-))

const myReducer = produce((draft:<Obj>, action:{type:”update_prop”; prop: Keys, value: any })=>{
  switch (action.type) {
    case “update_prop” :
      // below gets type error
      draft[action.prop] = action.value;
      return;
  }
})

1 Ответ

3 голосов
/ 26 июня 2019

Вы могли бы реализовать это таким образом

type Obj = {
  key1: number;
  key2: string;
  key3: string | null;
};

function mutateObj<T extends Obj, K extends keyof T>(obj: T, key: K, value: T[K]) {
  obj[key] = value;
}

const o: Obj = {
    key1: 1,
    key2: '2',
    key3: null,
};

mutateObj(o, 'key1', 'zz');

Кроме того, это сохранило бы безопасность типов значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...