Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 自动重命名非点表示法属性名称_Javascript_Typescript_Ide_Refactoring - Fatal编程技术网

Javascript 自动重命名非点表示法属性名称

Javascript 自动重命名非点表示法属性名称,javascript,typescript,ide,refactoring,Javascript,Typescript,Ide,Refactoring,在VisualStudio(或其他常见的javascript/typescript IDE)中,是否有一种简单的方法可以重命名类中的属性,并在代码中其他不使用点表示法的位置自动重命名它们 例如,当使用括号符号obj[“prop”]而不是obj.prop访问属性时,或出于某种原因列出属性名称子集时,会出现此问题: class C { constructor( public name: string, public age: number, public id: stri

在VisualStudio(或其他常见的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
,这至少会在重命名后导致编译器错误)或者足够聪明的IDEs来理解这种关系

有一个奇妙的想法,就是将所有内容转换为点表示法,即转换一个只包含对字符串的属性访问的未使用语句的伪函数,并对其进行解析。然后,通用IDE也会将其重命名。但是,这引入了应用程序本身完全不需要的代码,除非非常小心地编写,否则不会非常健壮,例如
Function.toString


除了手动执行大部分操作外,没有其他切实可行的方法吗?

如果您用存储属性名的变量替换硬编码字符串,这是可能的


请不要将您的类格式化为一行程序。很难读,这是不可能的。IDE不是Human。它可以检测字符串何时包含字符串以及何时包含属性名。若你们已经定义了接口,为什么不通过点访问它呢?在JavaScript中通过对象上的字符串索引访问属性简直就是地狱。我想这是不可能的。除非有办法告诉IDE字符串所指的属性(可能是通过typescript类型),否则无论如何都是毫无希望的。
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'