gpt4 book ai didi

javascript - Typescript - 如何从变量对象访问变量对象属性

转载 作者:行者123 更新时间:2023-12-03 07:59:33 24 4
gpt4 key购买 nike

我在尝试编写需要两个输入的函数时遇到了一些困难:

  1. 对象的名称
  2. 属性名称

并打印该对象的该属性的值。然而,这些对象都有不同的属性,它们并不完全相同。

对象看起来像这样:

class object1 {
get property1() {
return 'foo';
}
get property2() {
return 'bar';
}
}

export default new object1();
class object2 {
get different1() {
return 'asdf';
}
get different2() {
return 'ghjk';
}
}

export default new object2();

这是我迄今为止尝试过的:

import object1 from '..';
import object2 from '..';

getPropertValue(objectName, propertyName) {
let objects = [object1, object2];
let index = objects.indexOf(objectName);
console.log(objects[index][propertyName]);
}

这不起作用,返回为未定义。看起来索引计算正确,但 objects[index][propertyName] 似乎没有正确访问对象的值。尽管奇怪的是,当我尝试以下操作时,它几乎起作用了:

import object1 from '..';
import object2 from '..';

getPropertValue(objectName, propertyName) {
let objects = [object1, object2];
for (let index in objects) {
console.log(objects[index][propertyName]);
}
}

在这里,我实际上让它打印了正确的值,但问题是,由于我只是迭代 for 循环中的所有对象,它会尝试打印所有对象的值,而不仅仅是打印那个对象的值。与对象名称匹配。因此,它为具有我尝试访问的属性的对象打印正确的值,但随后对于不具有该属性的其他对象则未定义。

我想我可以向每个名为 name 的对象添加一些属性,并执行如下操作:

getPropertValue(objectName, propertyName) {
let objects = [object1, object2];
for (let index in objects) {
if(objects[index].name == objectName) {
console.log(objects[index][propertyName]);
}
}
}

但如果可以的话,我不想向这些对象添加不必要的属性。

有更好的方法吗?

最佳答案

对象可以由变量引用,但是对象不具有被命名的特性,除非您的代码明确地将其作为数据模型的一部分提供。

例如:

const obj = { abc: 123 }

这里的值{ abc: 123 }不是名为obj。有一个标识符为 obj 的变量引用了 { abc: 123 } 值。

这在实践中意味着,如果您只有对 { abc: 123 } 的引用,那么您无法知道其他哪些变量标识符也持有对此值的引用。

并且您无法通过字符串形式的标识符获取变量的值。

所以这不可能可能起作用:

const foo = 'bar'

function getVar(varName: string) {
// impossible function implementation here.
}

getVar('foo') // expected return value: 'bar'

但是您可以拥有的是一个具有属性的对象。属性的键是特定的字符串。

const objects = { // note the {}, [] is for arrays
object1,
object2,
}

这是以下内容的简写:

const objects = {
"object1": object1,
"object2": object2,
}

您现在拥有的对象的属性与您要用于对象的名称相对应。


最后,让我们正确输入您的函数:

// store this outside the function
const objects = {
object1,
object2,
}

function getPropertyValue<
T extends keyof typeof objects
>(
objectName: T,
propertyName: keyof typeof objects[T]
) {
console.log(objects[objectName][propertyName]);
}

此函数现在是通用的,这意味着它接受类型。在本例中,它接受您要用作 T 的对象名称,即 objects 对象的任何 keyof

然后,propertyName 参数使用任何键来通过将类型限制为这些对象之一的属性来找出应该允许哪些属性。

现在,要获取数据,请通过对象上的属性名称钻取到对象,然后再次钻取特定属性名称。

用法如下:

getPropertyValue('object1', 'property1') // 'foo'
getPropertyValue('object2', 'different1') // 'asdf'

getPropertyValue('object1', 'different1')
// Type error, 'different1' does not exist on 'object1'

See Playground

关于javascript - Typescript - 如何从变量对象访问变量对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74828866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com