有没有办法将道具名称作为字符串?

时间:2019-08-19 16:03:43

标签: javascript typescript

我试图概括一个重复3-4次的函数,我想知道是否有一种方法可以将属性故意转换为包含道具名称的字符串,以便以后访问它。

使用诸如Type.prop.toString()之类的字眼,表示我正在使用该类型,就好像它是一个值。

假设我有一个interface foo { bar: number, baz: number } 我需要做一些事情: foo.bar.toString()

为了能够用以下方式呼叫某事:

myFunction(foo.bar.toString())

哪个将用作:

myFunction(key: string) => {
   otherFunction(this.fooInstance[key]);
   //...
}

更多详细信息:

我想做的是这样:

  • myFunction(foo.bar.toString());
  • myFunction(foo.baz.toString());

我不这样做的原因(就像您对ramda那样):

  • myFunction("bar");
  • myFunction("baz");

通过重构可以很容易地忘记更新此部分。

我不需要对我的Foo类的每个键进行操作,只需要在调用myFunction时声明的少数几个键上进行操作。

如果您有任何疑问,请随时提出,很遗憾,我不是最好的交流者!

2 个答案:

答案 0 :(得分:1)

您可以使用枚举并动态设置接口键,以便您可以以字符串形式访问它们:

enum FooKeys {
  bar = "bar",
  baz = "baz"
}

interface IFoo {
  [FooKeys.bar]: number
  [FooKeys.baz]: number
}

function myFunction(key: FooKeys) {
  console.log(key);
}

myFunction(FooKeys.baz);

答案 1 :(得分:1)

要实现所需的功能,需要将该属性作为字符串传递。

所以这是正确的:

myFunction("bar");  
myFunction("baz");  

要解决您的特定问题-即支持重构并仅允许使用已知属性-您需要告诉TypeScript将key的值限制为IFoo的已知属性:

interface IFoo {
  bar: number
  baz: number
}

myFunction(key: keyof IFoo){ // <-- `key` may only match the name of a property on IFoo

}

这解决了您在问题中寻找的所有问题:

// ✔ Can only pass known property names: 'bar' | 'baz'
myFunction('bar');
myFunction('baz');

// ✔ Disallow unknown property names
// Error: '"test"' is not assignable to parameter of type '"bar" | "baz"'.
myFunction('test');

// ✔ Can refactor IFoo
// TypeScript will tell you if the string value is no longer valid
// and some IDEs will support renaming the strings when you rename the property :)