Не так практично, как хотелось бы, но работает, добавляя второй параметр generi c, соответствующий названию свойства.
export interface PatchOperation<T, P extends keyof T> {
from?: keyof T;
op: OperationType;
path: keyof T;
value?: T[P];
}
interface Parent {
creation: Date;
id: number;
name: string;
}
const update: PatchOperation<Parent, 'creation'> = {
op: OperationType.Replace,
path: 'creation',
value: 'string', // Type 'string' is not assignable to type 'Date'.ts(2322)
};
const update: PatchOperation<Parent, 'creation'> = {
op: OperationType.Replace,
path: 'creation',
value: new Date(), // ok
};
Практическое использование:
type PatchDocument<T, P extends keyof T> = PatchOperation<T, P>[];
const update = createAction(
'[Project] Update Project',
props<{
operation : PatchDocument<ProjectDTO, keyof ProjectDTO>
}>()
);