Типы для обозначения скобки в машинописи - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь создать одно избыточное действие для некоторых рутинных обновлений состояния и задаюсь вопросом, возможно ли заставить типы работать для скобочных обозначений:

interface IThing {
  someProp: string;
  otherProp: boolean;
}

const state = {
  thing: {
    someProp: 'prop',
    otherProp: true,
  } as IThing
}

const action = { name: 'someProp' as keyof IThing, value: 'someValue' as any }

// gives typescript error: Type 'any' is not assignable to type 'never'
state.thing[action.name] = action.value;

1 Ответ

1 голос
/ 08 апреля 2020

Проблема здесь в том, что если вы присваиваете значение с помощью динамического c имени свойства, то значение в правой части должно быть присвоено любому свойству, которое вы можете назвать. В этом случае это означает, что он должен быть назначен как string, так и boolean, что означает, что он должен иметь тип never (поскольку эти два типа не имеют общих значений).

Решение состоит в том, чтобы используйте обобщенный тип c, чтобы можно было ограничить имя свойства типом K, а назначаемое значение может иметь тип IThing[K], который необязательно never. Вот пример:

interface IAction<K extends keyof IThing> {
  name: K;
  value: IThing[K];
}

function assign<K extends keyof IThing>(thing: IThing, action: IAction<K>): void {
  thing[action.name] = action.value;
}

const action = { name: 'someProp', value: 'someValue' } as const;
assign(state.thing, action); // ok

Playground Link

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