重构 TypeScript
最后修改时间:2023 年 11 月 13 日重构意味着更新源代码而不改变应用程序的行为。重构可以帮助您保持代码可靠、干燥且易于维护。
移动重构
除了移动文件和文件夹之外,PyCharm 还允许您移动 TypeScript 顶级符号。Move Symbol Refactoring适用于 ES6 模块中的类、函数和变量。
移动类、函数或变量
选择要移动的符号。
按或选择重构 | 从主菜单或选择的上下文菜单移动。或者,选择重构 | 重构此或按,然后从列表中选择“移动” 。F6CtrlAltShift0T
“移动模块成员”对话框打开。
指定目标文件并选择要移动的成员。
默认情况下,PyCharm 会自动将成员的可见性提高到所需的级别。如果要保持可见性级别不变,请在“可见性”中单击“原样”。
拉动类成员重构
“上拉类成员”重构将类方法在类层次结构中向上移动 - 从当前类到超类或其实现的接口。
假设您有一个AccountingDepartment扩展抽象类Department并实现接口的类ReportingDepartment。
abstract class Department {
constructor(public name: string) {
}
printName(): void {
console.log("Department name: " + this.name);
}
}
interface ReportingDepartment {
generateReports(): void
}
class AccountingDepartment extends Department implements ReportingDepartment {
constructor() {
super("Accounting and Auditing");
}
printMeeting(): void {
console.log("The Accounting Department meets each Monday at 10 a.m");
}
generateReports(): void {
console.log("Generating accounting reports...");
}
}示例 1:将类方法移至超类
在此示例中,该PrintMeeting()方法从AccountingDepartment移至Department。
abstract class Department {
constructor(public name: string) {
}
printName(): void {
console.log("Department name: " + this.name);
}
printMeeting(): void {
console.log("The Accounting Department meets each Monday at 10 a.m");
}
}
interface ReportingDepartment {
generateReports(): void
}
class AccountingDepartment extends Department implements ReportingDepartment {
constructor() {
super("Accounting and Auditing");
}
generateReports(): void {
console.log("Generating accounting reports...");
}
}
示例 2:将类方法移至接口
在此示例中,PrintMeeting()方法从类复制AccountingDepartment到ReportingDepartment接口。
abstract class Department {
constructor(public name: string) {
}
printName(): void {
console.log("Department name: " + this.name);
}
}
interface ReportingDepartment {
generateReports(): void
printMeeting(): void
}
class AccountingDepartment extends Department implements ReportingDepartment {
constructor() {
super("Accounting and Auditing");
}
printMeeting(): void {
console.log("The Accounting Department meets each Monday at 10 a.m");
}
generateReports(): void {
console.log("Generating accounting reports...");
}
}将类的方法移至超类或接口
将插入符号放在类中要从中拉出成员的任意位置。
选择重构 | 从主菜单或上下文菜单中拉出成员。将打开“拉出成员”对话框。
从列表中,选择要将方法移动到的超类或接口。
要拉出方法,请在“要拉出的成员”列表中选中该方法旁边的复选框。如果适用,请选中要移动的方法旁边的“制作摘要”复选框。
重命名重构
除了在任何语言的上下文中可用的重命名文件和文件夹之外,您还可以重命名类、方法、变量、参数和字段。PyCharm 更改其声明中的符号名称,以及默认情况下其在当前项目中的所有用法。

“重命名”重构是就地执行的,但您可以按在“重命名”对话框中配置重构范围。ShiftF6
要默认打开该对话框,请打开“设置”对话框 ( ),然后转至编辑器| 代码编辑,然后在“指定重构选项”区域中选择“在模式对话框中”选项。CtrlAlt0S
提示
在“重命名”对话框中选中“搜索动态引用”复选框后,该对话框将默认打开,直到您清除该复选框。
在编辑器中,选择要重命名的类、方法、变量或字段,然后按或选择Refactor | 从上下文菜单或主菜单重命名。ShiftF6
在画布字段中,指定符号的新名称。输入名称或从列表中选择合适的名称。
可选:
单击
突出显示的符号旁边的 ,打开“同时在弹出窗口中重命名”,然后选择“在注释和字符串中搜索”和“搜索文本出现”复选框,以重命名注释、字符串文字和文本中符号的用法。
提示
重命名参数时,弹出窗口中的“同时重命名”
不可用。要指定其他选项,请再次打开“重命名”对话框。ShiftF6
可选:
要打开包含更多选项的重命名对话框,请再按一次。ShiftF6
选中“在注释和字符串中搜索”复选框可重命名注释、文档注释和字符串文字中符号的用法。
选中“搜索文本出现”复选框可重命名 HTML 和项目中包含的其他文件中的文本中的匹配符号。
选中“在 JavaScript 文件中搜索”复选框以重命名生成的 JavaScript 代码中符号的用法。
选择搜索动态引用复选框以重命名符号的动态用法。
提示
如果您选中“搜索动态引用”复选框,则默认情况下将打开该对话框,直到您清除它为止。
请注意,在重构中包含动态用法可能会导致错误的重命名,如下例所示。这里的
targetinconsole.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> 的动态引用”节点下。要将重构应用于用法,请从其上下文菜单中选择“包含” 。

保持类名称和包含文件的名称一致
当您重命名类时,如果文件具有相同的名称,PyCharm 还会建议重命名该文件。如果您接受建议,PyCharm 会在其他文件的导入语句中更新此文件的名称。
如果您拒绝此建议,您可以稍后使用“重命名文件...”意图操作重命名该文件。如果您刚刚创建了一个新文件,但在开始在其中键入类或接口时想出了一个更好的名称,那么这非常有用。
另一个意图操作建议将类移动到具有相应名称的新文件中。建议文件名的格式由从代码样式:JavaScript页面上的文件名约定列表中选择的样式确定。
保持文件名与对应类的名称一致
将插入符号放在类的名称处,然后按。AltEnter
从意图列表中,选择将文件重命名为 <class_name.ts> 以匹配类名称或将类 <class_name> 移动到文件 <class_name.ts>。

提取/引入重构
PyCharm 提供各种Extract重构来引入参数、变量、常量、字段、方法和函数。要运行任何这些重构,请选择要重构的表达式,然后选择“重构”|“重构”。<目标>。您可以选择整个表达式或将插入符号放置在其中的任何位置,PyCharm 将帮助您进行选择。
参数介绍
使用引入参数重构将函数调用中的表达式替换为参数。PyCharm 将相应地更新函数的声明和调用。新参数的默认值可以在函数体内初始化或通过函数调用传递。
假设您有一段"Hello, "在函数中硬编码的代码greeter()。
function greeter(firstName : String, lastName : String) {
return "Hello, " + firstName + " " + lastName;
}
document.body.innerHTML = greeter("Jane","User");"Hello, "编码greeting。新greeting参数可以作为可选参数或根据需要提取。示例 1:提取可选参数
提取新参数greeting作为可选参数。greeter()新参数被添加到使用函数默认参数语法的定义中。的调用greeter()没有改变。
function greeter(firstName : String, lastName : String, greeting = "Hello, ") {
return greeting + firstName + " " + lastName;
}
document.body.innerHTML = greeter("Jane","User");示例2:提取所需参数
greeting在该示例中,提取新参数作为必需参数。所以相应的函数调用(document.body.innerHTML = greeter(user);也相应改变。
function greeter(firstName : String, lastName : String, greeting: string) {
return greeting + firstName + " " + lastName;
}
document.body.innerHTML = greeter("Jane", "User", "Hello, ");引入一个参数
在编辑器中,将插入符号放在要转换为参数的表达式内,然后按或选择Refactor | 从上下文菜单中引入参数。CtrlAlt0P
或者,执行以下操作之一:
按并选择引入参数。CtrlAltShift0T
转到重构 | 摘录| 范围。
如果在当前插入符号位置检测到多个表达式,请从“表达式”列表中选择所需的表达式。
