Существует две основные c проблемы с описанной вами ситуацией - одна из них связана с TypeScript, другая - нет.
Проблема TypeScript заключается в том, что TS знает имена свойств в в общем, и проверит, что вы все настраиваете правильно - как при использовании обычного поиска и присваивания свойства JS, так и при использовании функций get
и set
Ember. В частности, типы для Ember стараются не допустить опечатки при выполнении get
и set
. Вы можете понять, почему они не допускают произвольные строки в этом примере:
import Component from '@ember/component';
import { action, set } from '@ember/object';
export default class Whoops extends Component {
greeting = 'Hello';
@action updateGreeting(newGreeting) {
set(this, 'greering', newGreeting);
// ----^--- TYPO!!!
}
}
Если типы для set
(или get
) просто допускают произвольные строки, TS не сможет вам помочь вообще Вот; он позволил бы ему go, и вам пришлось бы самостоятельно выяснить ошибку - вместо того, чтобы компилятор заранее предупредил вас об этом заранее.
В случае, если вы столкнетесь, предположительно, TypeScript просто видит строку и говорит: «У меня нет никакого способа проверить, принадлежит ли эта строка свойству».
Здесь есть несколько способов улучшить вещи. Прежде всего, если вы можете, вы должны выяснить, возможно ли ограничить тип propertyName
, чтобы он был keyof
для типа, из которого он исходит. (Объяснение keyof
выходит за рамки этого ответа, этот раздел в справочнике и этого сообщения в блоге поможет вам быстрее.)
Во-вторых, хотя и связан с более крупной проблемой: в ходе обсуждения другого ответа на этот вопрос вы отметили, что проблема заключается в том, что вы пытаетесь глубоко установить свойства для одного фрагмента отслеженного состояния root. В общем, вы должны , а не изменять состояние автотрекинга таким образом - это пережиток старых шаблонов, управляемых наблюдателями, которые Ember Classi c использовал с его вычисленными свойствами. Вместо этого предпочитайте направлять все изменения в это состояние с автоматическим отслеживанием через владельца этого состояния. Тогда вам вообще не понадобится set
, и система автоматически обновится правильно.
Вы можете сделать это либо путем автоматического отслеживания вложенного состояния , либо путем определения класс для него или с помощью чего-то вроде отслеживаемых встроенных , чтобы обернуть простой JS объект. В любом случае, вместо достижения и глубокого изменения этого состояния из любого места, сделайте это только на объекте, который владеет этим состоянием. Если вы следуете этому шаблону и ограничите propertyName
значением keyof TheOwnerOfTheState
, где TheOwnerOfTheState
- некоторый класс, все будет «просто работать» - как на стороне Ember, так и на стороне TypeScript.