Typescript 如何在不硬编码属性名称的情况下重写代码?

Typescript 如何在不硬编码属性名称的情况下重写代码?,typescript,refactoring,ramda.js,Typescript,Refactoring,Ramda.js,我正在使用Ramda.js和Typescript。从我使用的对象中获取一些值 例如: export interface Store { foo: { bar: string; }; } const store: Store = { foo: { bar: 'baz' } }; const fooBarLens = R.lensPath(['foo', 'bar']); 不幸的是,如果我将通过WebStorm进行重构,并在类存储中将属性栏重命名为b

我正在使用Ramda.js和Typescript。从我使用的对象中获取一些值

例如:

export interface Store {
    foo: {
       bar: string;
    };
}

const store: Store = {
  foo: {
    bar: 'baz'
  }
};
const fooBarLens = R.lensPath(['foo', 'bar']);
不幸的是,如果我将通过WebStorm进行重构,并在类存储中将属性栏重命名为baz,那么函数fooBarLens将停止工作

但如果在重构之前,我将重写函数fooBarLens,如下所示:

然后重构就可以正常工作了


如何使用lensPath和其他Ramda函数重写而不硬编码属性名称并避免重构问题?

我认为没有很好的解决方案。这是使用基于字符串的API的权衡之一。我见过的许多重构工具也提供了在字符串和注释中重命名属性的功能,这可能就足够了,特别是当它一个接一个地引导您遍历这些字符串并为您提供决策时

但有一种技术使这变得更容易:将数据模型的处理集中在单个模块中。如果必须在整个代码库中更改此类代码,则可能会变得很糟糕:

const phone = view(lensPath(['contact', 'phones', 'primary'], user);
如果您的用户模块公开phoneLens并且您的代码只是

const phone = view(phoneLens, user)
然后,当模型更改时,可以在该位置切换

const phoneLens = lensPath(['contact', 'phone', 'primary'])

不需要更改代码的其余部分

请记住,在JavaScript中,store.foo.bar格式实际上不是核心。它只是对更基本的store['foo']['bar']版本的语法甜点。重构工具也许有一天会赶上这种理解,如果他们还没有这样做的话

const phoneLens = lensPath(['contact', 'phone', 'primary'])
const phoneLens = lensPath(['contacts', 'telephone', 0])