重构 TypeScript
重构 是在不改变应用程序行为的情况下更新源代码。 重构有助于让您的代码保持健壮、 DRY ,且易于维护。
移动重构
除了 移动文件和文件夹之外,GoLand 还允许您移动 TypeScript 顶级符号。 移动符号重构 适用于 ES6 模块中的类、函数和变量。
移动类、函数或变量
选择要移动的符号。
按 F6 或从主菜单或选择的上下文菜单中选择 。 或者,选择 或按 Ctrl+Alt+Shift+T ,然后在列表中选择 。
移动模块成员 对话框将打开。
指定目标文件并选择要移动的成员。
默认情况下,GoLand 会自动将成员权限提升到所需级别。 如果您希望保持可见性级别不变,请在 可见性 中点击 按原样。
上移类成员重构
上移类成员重构将类方法在类层次结构中上移——从当前类移动到它实现的超类或接口。
假设您有一个类 AccountingDepartment ,它扩展了一个抽象类 Department 并实现了一个接口 ReportingDepartment。
示例 1:将类的方法移动到超类
在这个例子中,该 PrintMeeting() 方法被从 AccountingDepartment 移动到 Department。
示例 2:将一个类方法移动到接口
在此示例中, PrintMeeting() 方法从 AccountingDepartment 类复制到 ReportingDepartment 接口。
将类的方法移动到超类或接口
将插入符放在您要上拉成员的类中的任意位置。
在主菜单或上下文菜单中选择 。 将打开 上移成员 对话框。
请从列表中选择您要移动方法的超类或接口。
要上拉某个方法,请在 要上移的成员 列表中选中其旁边的复选框。 如果适用,请选择方法旁边的 设为抽象 复选框。
重命名重构
除此之外,在任何语言环境中均可使用的 重命名文件和文件夹功能,您还可以重命名类、方法、变量、参数和字段。 GoLand 会更改符号在其声明中的名称,并默认更改当前项目中的所有用法。
重命名重构是在原地执行的,但您可以按 Shift+F6 来在 重命名 对话框中配置重构范围。
要默认打开对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 ,并在 指定重构选项 区域中选择 在模式对话框中 选项。
在编辑器中,选择要重命名的类、方法、变量或字段,然后按 Shift+F6 或从上下文菜单中选择 。
在画布中指定符号的新名称。 输入名称或从列表中选择一个合适的名字。
可选:
点击
旁边的高亮符号以打开 同时在以下位置重命名 弹出窗口,并选中 在注释和字符串中搜索 和 搜索文本出现位置 复选框以重命名该符号在注释、字符串文本和文本中的用法。
可选:
要打开 重命名 对话框查看更多选项,请再次按 Shift+F6。
选中 在注释和字符串中搜索 复选框,以重命名注释、文档注释和字符串字面量中的符号用法。
选中 搜索文本出现位置 复选框,可以重命名项目中 HTML 和其他文件中的匹配符号。
选中 在 JavaScript 文件中搜索 复选框以重命名生成的 JavaScript 代码中的符号用法。
选中 搜索动态引用 复选框以重命名符号的动态用法。
请注意,包括动态用法的重构可能会导致如下面示例中所示的错误重命名。 这里
target在console.log(e.target)里可以更改为myTarget,因为e的类型是any,这意味着它也可以是myInt。interface myInt { target: string } function onClick(e: any) { console.log(e.target); }interface myInt { myTarget: string } function onClick(e: any) { console.log(e.myTarget); }
为避免错误重命名,请在应用更改之前 预览这些更改。
默认情况下,在 重构预览 工具窗口中,所有符号的动态用法都会被标记为排除,并分组到 代码中对<symbol>的动态引用 节点下。 要将重构应用于某个用法,请从其上下文菜单中选择 包含。
保持类名和所含文件一致性
当您重命名类时,如果该文件与其同名,GoLand 也会建议重命名该文件。 如果您接受该建议,GoLand 会在其他文件的 import 语句中更新该文件的名称。
如果您拒绝该建议,您可以随时使用 重命名文件… 意图操作重命名该文件。 如果您刚刚创建了一个新文件,但在其中开始键入类或接口时又想出了更好的名称,此操作会很有用。
另一种意图操作建议将类移动到具有相应名称的新文件中。 建议文件名的格式由 文件名约定 列表中选择的样式决定,可在 代码样式:JavaScript页面上找到。
将文件名称与对应类的名称保持一致
将文本光标放置在类名处并按 Alt+Enter。
从意图列表中选择 将文件重命名为<class_name.ts>以匹配类名 或 将类<class_name>移动到文件<class_name.ts>。
提取/引入重构
GoLand 提供多种 提取 重构,用于引入参数、变量、常量、字段、方法和函数。 要运行这些重构中的任意一个,请选择要重构的表达式,然后选择 。 您可以选择整个表达式,或者将插入符放在其内部的任意位置,GoLand 会帮助您完成选择。
引入参数
使用 引入参数 重构将函数调用中的表达式替换为参数。 GoLand 会相应更新该函数的声明及其调用。 新参数的默认值可以在函数体内初始化,或通过函数调用传递。
假设您有一段代码,其中在函数 "Hello, " 中硬编码了 greeter()。
通过引入参数重构,您可以将此硬编码的 "Hello, " 替换为一个 greeting 参数。 新 greeting 参数可以提取为 可选 或 必需。
示例 1:提取一个可选参数
新 greeting 参数被提取为可选参数。 已使用函数默认参数语法将新参数添加到 greeter() 的定义中。 greeter() 的调用未更改。
示例 2:提取必需的参数
在此示例中,一个新参数 greeting 被提取为必需参数。 因此,相应的函数调用 (document.body.innerHTML = greeter(user); 随之更改。
引入参数
在编辑器中,将插入符放在您要转换为参数的表达式内,然后按 Ctrl+Alt+P ,或在上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前插入符位置检测到多个表达式,请从 表达式 列表中选择所需的表达式。
如果找到多个所选表达式的出现位置,请从 找到多个出现位置 列表中选择 仅替换此处 或 替换所有出现位置。 最后,会显示用于配置重构的弹出窗口。
选中 生成 JSDoc 以生成 JSDoc 注释块。 如果您需要指定自定义的默认参数值,这可能会有所帮助。
选择新参数将在何处初始化,并指定其默认值(如果适用):
如果选中 可选参数 复选框,参数将在函数体内使用默认值进行初始化。
如果清除 可选参数 复选框,默认参数值将通过现有函数调用传递。 所有函数调用将根据新的函数签名进行更改,并在函数体内添加参数初始化。
最初,GoLand 会将在调用重构的位置处的表达式作为默认值。 在大多数情况下,您不需要更改它。 如果仍有必要,请在 JSDoc 注释中以
@param <parameter name> - <default value>的格式指定另一个默认值。了解更多有关可选参数和默认参数的信息,请访问 TypeScript official website。
在列表中双击以接受建议的参数名称之一,或在带有红色画布的字段中指定自定义名称。 按 Enter 准备。
选择重构模式
您可以在编辑器中(就地模式)提取参数 如上所述或使用 引入参数对话框。 这两种方法非常相似,区别如下:
引入变量
使用 Introduce Variable重构将表达式替换为 函数作用域变量 (var)、 块作用域变量 (let)或 块作用域常量 (const)。 这次重构使您的源代码更易于阅读和维护。 它还帮助您避免使用没有关于其值或用途说明的硬编码常量。
引入变量
在编辑器中,选择要转换为变量的表达式,然后按 Ctrl+Alt+V 并从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前插入符位置检测到多个表达式,请从 表达式 列表中选择所需的表达式。
如果找到多个所选表达式的出现位置,请从 找到多个出现位置 列表中选择 仅替换此处 或 替换所有出现位置。
最后,会显示用于配置重构的弹出窗口。
从列表中选择用于声明新变量的语句:
在列表中双击以接受建议的参数名称之一,或在带有红色画布的字段中指定自定义名称。 按 Enter 准备。
选择重构模式
您可以直接在编辑器中(以原地模式)提取变量 如上所述或使用 变量引入对话框。 默认情况下,GoLand 运行 Introduce Variable 重构,在就地模式下。 要使用 提取变量 对话框,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 │ 代码编辑 ,并在 重构 区域中选择 在模态对话框 选项。
引入常量
使用 Introduce Constant 重构来将表达式替换为 constant。 这次重构使您的源代码更易于阅读和维护。 它还帮助您避免使用没有关于其值或用途说明的硬编码常量。
假设您有一段包含硬编码 Department name: 的代码。
通过“Introduce Constant”重构,您可以用常量替换硬编码的 Department name。 提取常量的范围取决于新常量声明的上下文(在封闭方法内部、作为类的字段或不在任何类中)。
示例 1:引入的常量 departmentName 在封闭方法 printName() 中声明
示例 2:引入的常量被声明为外围类 AccountingDepartment 的 _departmentName 字段
示例 3:引入的常量 departmentName 在任何类外声明
引入常量
在编辑器中,选择要转换为常量的表达式并按 Ctrl+Alt+C 或从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果在当前插入符位置检测到多个表达式,请从 表达式 列表中选择所需的表达式。
选择新常量的作用范围:
如果 GoLand 检测到多个该表达式的出现位置,请选择您是要替换所有出现位置,还是仅替换调用重构的位置。
在列表中双击以接受建议的参数名称之一,或在带有红色画布的字段中指定自定义名称。 按 Enter 准备。
引入字段
引入字段 重构声明一个新字段,并使用所选表达式对其进行初始化。 原始表达式被字段的用法替换。
假设您有以下代码:
在以下所有三个例子中,引入了相同的字段, _calcArea。 这些例子展示了三种不同的方式来初始化引入的字段。
示例 1:引入的字段 _calcArea 在封闭方法 getArea() 中初始化
示例 2:引入的字段 _calcArea 在声明中被初始化
示例 3:引入的字段 _calcArea 在类的构造函数中初始化
介绍一个字段
在编辑器中,选择要转换为常量的表达式并按 Ctrl+Alt+F 或从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果 GoLand 检测到多个该表达式的出现位置,请选择您是要替换所有出现位置,还是仅替换调用重构的位置。
在弹出窗口中,选择新字段将在哪里初始化:

在字段声明或构造函数中初始化时,可以使用 readonly修饰符引入新字段。 要做到这一点,选中 设为只读 复选框。
请选择字段可见性,可用选项有 公开、 不公开 和 protected。 了解字段可见性修饰符详细信息,请参阅 TypeScript 官方网站
在列表中双击以接受建议的参数名称之一,或在带有红色画布的字段中指定自定义名称。 按 Enter 准备。
选择重构模式
默认情况下, GoLand 会直接在编辑器中(以就地模式)执行引入字段重构, 如上所述。
要使用 提取字段对话框 ,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 │ 代码编辑 ,并在 重构 区域中选择 在模式对话框中 选项。
提取方法
提取方法 重构可让您使用提取的代码创建一个具名的方法或函数。 当调用 提取方法 重构时,GoLand 会检测作为所选代码片段输入的变量以及作为其输出的变量。 检测到的输出变量将用作提取的方法或函数的返回值。
示例 1:从另一个方法内的表达式中提取全局方法
在此示例中,从 let c = a + b; 表达式中提取了一个全局范围的方法 NewMethod()。 提取方法的参数从 let c = a + b; 表达式中获取。
示例 1.1:生成一个函数声明
示例 1.2:在表达式内声明提取的函数
示例 2:在封闭方法内部声明提取方法
在此示例中,方法 NewMethod() 从 let c = a + b; 表达式中提取。 目标范围 function MyFunction 已选择。
示例 3:从任何方法之外的表达式中提取方法
从 var e = MyFunction(4, 6); 表达式中提取出一个 NewMethod() 方法,该表达式不在任何方法内。 提取的方法是全局范围的。
提取函数
在编辑器中,选择一个代码片段转换成函数,然后按 Ctrl+Alt+M 或从上下文菜单中选择 。
或者,执行以下操作之一:
按 Ctrl+Alt+Shift+T 并选择 。
转到 。
如果所选表达式在另一个函数内部,请从列表中选择目标作用域:
要打开具有更多选项的 Extract Function提取函数 对话框,请再次按 Ctrl+Alt+M。 在此对话框中,您可以选择提取的函数是通过生成的 function declaration声明,还是 在表达式内部声明,并配置要作为参数传递的变量集。 请参见 上面的示例。
默认打开 Extract Function 对话框
打开 设置 对话框 (Ctrl+Alt+S ),进入 编辑器 │ 代码编辑 ,并在 重构 区域选择 在模态对话框 选项。
提取类型别名
使用此重构将类型声明表达式转换为 type alias ,并将所有出现的表达式替换为此别名。
假设您有以下带有 { z: number } 类型声明的代码片段:
在下面的示例中,一个类型别名 MyNewAlias 被从 { z: number } 类型声明中提取出来:
提取类型别名
在编辑器中, 将文本光标置于您希望用类型别名替换的表达式内, 然后从上下文菜单中选择 或从主菜单中选择 。
如果在当前插入符位置检测到多个表达式,请从 表达式 列表中选择所需的表达式。
如果找到多个所选表达式的出现位置,请从 找到多个出现位置 列表中选择 仅替换此处 或 替换所有出现位置。
在该字段中,输入类型别名的名称,然后按下 Enter 完成操作。
提取超类
提取超类 重构会基于当前类的成员创建一个新的抽象类。 所创建的抽象类会被自动扩展。
假设您有一个类 AccountingDepartment ,并且您预计其中的 printName() 方法将被重用。
您可以提取一个超类 Department 并在其中包含 printName 和 Name 字段。
提取超类
将插入符放在您要提取超类的类中的任意位置。
从主菜单中选择 或从上下文菜单中选择 。 提取超类 对话框已打开。
指定新超类的名称,并选中要包含在其中的类成员旁边的复选框。
在 目标文件 字段,指定新类所在文件的位置。 默认情况下,该字段会显示调用重构所在的当前文件路径。
选择 提取超类。 GoLand 创建一个新类,并使用
extends标记源类。要创建一个超类,并将方法参数中对源类的引用替换为对该超类的引用,请选择 提取超类,并在可能的情况下使用它。 GoLand 会在 查找 工具窗口的 重构预览 窗格中显示建议的更改。
提取接口
该 提取接口 重构基于当前类的成员创建新接口。 创建的接口将自动实现。
假设您有一个类 AccountingDepartment 并且您期望其中的 generateReports() 方法将有其他实现。
您可以提取一个 DepartmentInterface 接口并将 generateReports() 包含在其中。
提取接口
将文本光标置于您想要提取接口的类中的任何位置。
请选择 从主菜单或 从上下文菜单。 提取接口 对话框已打开。
指定新接口的名称,并选择您希望包含在其中的类成员旁边的复选框。
在 目标文件 字段中,指定新接口所在文件的位置。 默认情况下,该字段会显示调用重构所在的当前文件路径。
选择 提取接口。 GoLand 创建一个新的接口,并将源类标记为其实现。
要创建一个接口并将方法参数中对源类的引用替换为对接口的引用,请选择 提取接口,并在可能的情况下使用它。 GoLand 会在 查找 工具窗口的 重构预览 窗格中显示建议的更改。
引入对象或数组解构
解构让您可以轻松地将数组和对象中的值解包到变量中。 该功能具有非常简洁的语法,通常在您需要在应用程序中传递数据时使用。 如需了解更多信息,请参阅 TypeScript official website。
在 GoLand 中,您可以通过意图操作 Alt+Enter 调用解构。 使用 替换为对象/数组解构 操作,将移除原始赋值。 要保留原始赋值,请使用 引入对象/数组解构。
替换原始分配
将插入符放在数组或对象的值处,然后按 Alt+Enter。
从列表中选择 替换为对象解构 或 替换为数组解构。
如果数组或对象中的某些值未使用,这些元素将被跳过:
保留原始分配
将插入符放在数组或对象的值处,然后按 Alt+Enter。
从列表中选择 介绍对象解构 或 介绍数组解构。
生成函数的解构参数
将插入符放在函数的参数处,然后按 Alt+Enter。
从列表中选择 将参数转换为对象。
内联重构
内联重构与 提取重构相反。
示例 1:内联变量
内联变量 重构会将变量或常量的多余用法替换为其初始化器。 此类重构仅适用于块作用域变量和函数作用域变量。
示例 2:内联方法
内联方法/内联函数 重构会将方法或函数的主体放入其调用方的主体中;方法/函数本身将被删除。
在下面的示例中, Sum() 的主体被放置在 Multiplication() 的主体内。
进行 Inline 重构
在编辑器中,将文本光标放在要内联的符号处,然后按 Ctrl+Alt+N ,或从上下文菜单或主菜单中选择 。
更改签名重构
使用 Change Signature重构来更改函数的名称、可见性和返回类型,添加、删除、重新排序和重命名参数,并通过调用层次结构传播新参数。
您还可以使用 Introduce Parameter重构添加一个参数。
在下面的示例中,函数 eat() 被重命名为 feed() ,并引入了一个新的 boolean 参数 isMammal。
调用更改签名
在编辑器中,将插入符放在要重构的函数名称内,然后按 Ctrl+F6 ,或从上下文菜单或主菜单中选择 重构 | 更改签名。 更改签名 对话框打开。
重命名函数
在 更改签名 对话框 Ctrl+F6 中,编辑 名称 字段。
更改函数的返回类型
在 返回类型 字段中,指定函数返回值的类型。 如果该字段为空,则返回类型将被视为
void。 了解更多有关返回类型的信息,请访问 TypeScript 官方网站。
更改函数的可见性
从 可见性 列表中选择一个 函数修饰符 ,可用的选项有 public(默认)、 private和 protected。
管理函数参数
在 更改签名 对话框 Ctrl+F6 中,使用参数表及其右侧的按钮:
要添加参数,点击
  Alt+Insert ,并指定新参数的名称及其类型。 指定参数的默认值或通过函数调用传递的值。
如果有必要,把 新参数传递给调用当前函数的函数。
要移除参数,请点击相应行中的任意单元格,然后点击
  Alt+Delete。
要重新排序参数,使必需参数列在可选参数之前,请使用
  Alt+Up 和
  Alt+Down。 更多信息,请访问 TypeScript official website。
要重命名参数,请编辑 名称 字段。
沿调用层次传播参数
在 更改签名 对话框 Ctrl+F6 中,选择参数并点击
。 将打开 选择传播新参数的方法 对话框。 左侧窗格显示函数调用的层次结构。 当您选择一个函数时,右侧窗格会分别在 调用方法 和 被调用方法 字段中显示该函数的代码及其所调用函数的代码。在左侧窗格中,选中您希望传播参数的函数旁边的复选框,然后点击 确定。
预览更改并完成重构
将默认导出转换为命名导出
对于类、函数、常量变量、字符串、对象和类型,您可以将 export default 语句替换为命名的 export 语句,并相应更新对应的 import 语句。
如果符号被重新导出,相应的 export 语句也会更新。
重构可以从 export default 和 import 语句中调用。
将光标放在
export default语句或您要导出的名称上,按 Alt+Enter ,然后选择 将 default export 转换为命名 export。 要切换预览,请按 Ctrl+Q。
在
import语句中,将光标放在导入内容的名称上,按 Alt+Enter ,然后选择 将 default export 转换为命名 export。 预览(Ctrl+Q )显示import语句将如何更新。
将命名 export 转换为 default export
对于类、函数、常量、字符串、对象和类型,您可以将命名 export 语句替换为 export default 语句,并相应更新对应的 import 语句。
重构可以从 export default 和 import 语句中调用。
将插入符号置于
export语句内所导出内容的名称处,按下 Alt+Enter ,然后选择 将命名 export 转换为 default export。 要切换预览,请按 Ctrl+Q。
在
import语句中,将光标放在导入内容的名称上,按 Alt+Enter ,然后选择 将命名 export 转换为 default export。 预览(Ctrl+Q )显示import语句将如何更新。