Проблема здесь в том, что если вы присваиваете значение с помощью динамического 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