自动重命名非点符号属性名称

时间:2017-07-09 21:45:33

标签: javascript typescript ide refactoring

在visual studio(或其他常见的javascript / typescript IDE)中,是否有一种简单的方法可以重命名类中的属性,并自动将它们重命名为代码的其他位置,它们也不是以点式表示法?

问题出现,例如当使用括号表示法obj["prop"]而不是obj.prop访问属性时,或者出于某种原因列出属性名称的子集时:

class C {
  constructor(
    public name: string,
    public age: number,
    public id: string
  ){}
};
let obj = new C("bob", 30, "abcdef");
let interesting = ["name", "age"];
console.log(`${interesting[0]}: ${obj[interesting[0]]}, ${interesting[1]}: ${obj[interesting[1]]}`);

我不知道将这些字符串与属性名称相关联的好方法(除了将字符串键入为keyof C,这至少会在重命名后给出编译器错误)或IDE足够智能了解这种关系。

有一种奇特的想法,即将所有内容转换为点符号,使用a method taken from a related question - 即将仅包含未使用的属性访问语句的虚函数转换为字符串并解析该函数​​。然后,常见的IDE将重命名它。然而,这引入了对于应用程序本身完全没有必要的代码,并且除非非常谨慎地编写,否则它不是非常健壮的 - 例如, Function.toString is partly implementation dependant

除了手动完成大部分操作外,是否没有实用的方法?

1 个答案:

答案 0 :(得分:0)

如果将硬编码字符串替换为存储属性名称的变量,则有可能

https://stackoverflow.com/a/47707719/2167309

var person = {};
person.firstname = 'Jack';
person.address = "123 Street";

function getPropertyName(obj, expression) {
    var res = {};
    Object.keys(obj).map(k => { res[k] = () => k; });
    return expression(res)();
}

let propertyName = getPropertyName(person, o => o.address);
console.log(propertyName); // Output: 'address'