Это, кажется, текущее ограничение Typescript.Я нашел эту проблему , описывающую этот конкретный случай.
Обходной путь такой же, как вы уже упоминали.Вам придется привести this.objA
к другому типу, который позволяет установить поле prop2
.Итак:
(this.objA as ClassA & {prop2: string}).prop2 = "bar"
// Or to trade some safety for brevity:
(this.objA as any).prop2 = "bar"
В противном случае вы также можете использовать охрану пользовательского типа для подтверждения существования этого ключа.Используя проблему, описанную выше, вы можете сделать что-то вроде этого:
function inOperator<K extends string, T>(k: K, o: T): o is T & Record<K, any> {
return k in o;
}
Затем, используя это вместо оператора in
:
if (inOperator("prop2", this.objA)) {
this.objA.prop2 = "bar"; // No error now
}