具有可变属性名称的emberjs glimmer对象set()

问题描述 投票:0回答:1

我在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。

typescript ember.js glimmer.js
1个回答
0
投票

通常,如果您的财产是@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]告诉打字稿做您想做的事,它只会忽略它。但是通常,如果您动态计算属性键,则不能依赖静态分析。

© www.soinside.com 2019 - 2024. All rights reserved.