Я нашел несколько неплохое решение, которое позволяет избежать копирования.Инкапсулируйте изменение в методе "setProperty":
changeProp<V extends T[K], T, K extends keyof T>(obj:
{ [P in keyof T]: T[P] }, key: K, value: V): T & { [P in K]: V } {
obj[key] = value; // The required change is not verified, but at least only 1 copy for entire program
return obj as T & { [P in K]: V };
}
. В этом заключается проблема, заключающаяся в том, что возвращаемый тип ограничен только в V в отношении типа V, а не в передаваемом значении. Это можно указать с помощью явногохотя общие параметры:
var invoiced: InvoicedInvoice = this.changeProp<invoiceState.Invoiced, Invoice, "state">(invoice, "state", invoiceState.Invoiced);
Теперь проблема заключается в том, что должны быть указаны все общие параметры, а не только V. Желательно, чтобы был указан только V или ни один из общих параметров.