我在Ember 3.15中有一个组件正在尝试执行类似操作
import { action, set } from '@ember/object';
@action
someMethod() {
const value = ... // something random
let propertyName = ... // some variable string
set(this, propertyName, value);
}
似乎在浏览器中工作正常,但打字稿将设置行标记为错误(特别是propertyName参数)。因此,如果可行,为什么打字稿不喜欢它?
这似乎也发生在get()上,它不喜欢像get(this, propertyName)
这样的变量propertyNames。
通常,如果您的财产是@tracked
,则不需要set
,而只需做this[propertyName] = value;
。
但是您的问题可能是一般的打字稿限制。实际存在一个静态类型的一般问题:
Typescript仅执行静态分析。因此它不会执行您的代码。因此无法知道动态生成的属性键是否确实存在。
因此,如果您有类似这样的内容:
class Foo {
data1: number = 1;
data2: number = 2;
foo() {
const fixedProp = 'data1';
console.log(this[fixedProp]);
const dynamicProp = 'data' + (1 + 1);
console.log(this[dynamicProp]);
}
}
然后,打字稿将无法验证this[dynamicProp]
是否确实存在,因为为此,它需要execute 'data' + (1 + 1);
,这样才能知道dynamicProp
的实际含义。因此,不可能通过静态分析来知道this[dynamicProp]
是否存在。
您只可以按(this as any)[dynamicProp]
告诉打字稿做您想做的事,它只会忽略它。但是通常,如果您动态计算属性键,则不能依赖静态分析。