TypeScript 导入声明的重命名不正确

scyqe7ek  于 4个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(66)

TypeScript版本:aa3734c
搜索词:
代码

file1.ts

export const abc = 1;

file2.ts

import {abc} from "./file1";
abc; // Rename this one to def

预期行为:

file1.ts

export const def = 1;

file2.ts

import {def} from "./file1";
def; // Rename this one to def

实际行为:

file1.ts

export const def = 1;

file2.ts

import {abc as def} from "./file1";
def; // Rename this one to def

看起来前缀/后缀逻辑假设导出是一个单独的语句,而不是声明本身。

xghobddn

xghobddn1#

版本:1.30.0-内部预览版(用户设置)
提交:456e8e64beb2dceac66743959f6802b66e18e300
日期:2018-11-26T11:05:14.406Z
Electron:2.0.12
Chrome:61.0.3163.100
Node.js:8.9.3
V8:6.1.534.41
操作系统:Windows_NT x64 10.0.17763

6uxekuva

6uxekuva3#

@amcasey 我在VS Code 1.30中无法使用TS 3.3.0-dev.20181127的REPO。您认为这是VS Code的问题吗?

8gsdolmq

8gsdolmq4#

@mjbvz,不,我认为这不是VS Code的问题,我只是觉得你会对此感兴趣,因为编辑器同步中出现了几次新的重命名功能。

balp4ylt

balp4ylt5#

我也无法在VS code中复现这个问题,无论是昨天的TypeScript构建。

jdg4fx2g

jdg4fx2g6#

这里有一个更复杂的示例,展示了Code 1.34和typescript@next中的错误:

// @Filename: welove.ts
const g = 4567;
export = g;
// @Filename: app.tsx
import good = require('./welove')
console.log(good/*1*/)

/*1*/处的Find-all-refs找到了所有四个引用,这是有争议的,因为ggood具有不同的名称。在/*1*/处重命名所有四个引用,这似乎不好,因为ggood不是相同的名称,而welove.ts可能是一个d.ts文件,重命名会导致中断。

// @Filename: welove.ts
const g = 4567;
export const good = g;
// @Filename: app.tsx
import { good } from './welove'
console.log(good/*1*/)

在这里,在(1)处的find-all-refs找到了最后三行,这似乎没问题。但即使导入是import { good as go },它也似乎是错误的,与export=示例相同。重命名功能完全失效。在(1)处重命名最后一行,将导入重命名为import { good as go },然后错误地重命名了export const go = g
这种行为在emacs中也是一样的,这是我测试过的唯一其他编辑器。以下是我的tsconfig,以防需要:

{
    "compilerOptions": {
        "strict": true,
        "noImplicitThis": false,
        "noImplicitAny": true,
        // "noUnusedLocals": true,
        //"noImplicitThis": true,
        //"noImplicitReturns": true,
        // "strictNullChecks": false,
        "target": "esnext",
        "lib": ["es5", "es2015", "es2016", "es2017", "esnext", "dom"],
        "allowJs": true,
        "checkJs": true,
        "outDir": "out",
        "jsx": "preserve",
        "esModuleInterop": true,
        "module": "commonjs"
    },
    "include": [
        "ex.d.ts",
        "other.d.ts",
        "mod1.js",
        "test.js",
        "welove.ts",
        "first.ts",
        "forever.js"
    ]
}
deyfvvtc

deyfvvtc7#

在与@amcasey进行了更多的讨论后,我认为前两个示例的当前行为是可以接受的,因为我们没有可靠方法来判断一个符号是否来自不应该重命名的文件。
然而,这个例子在重命名(以及可能在find-all-refs中)存在一些问题:

// @Filename: welove.ts
const g = 4567;
export const good = g;
// @Filename: app.tsx
import { good/*0*/ as gold/*1*/ } from './welove'
console.log(gold/*2*/)
  • 在(1)或(2)处重命名应该只重命名引入的别名 gold 。目前它也重命名了所有出现的 good (并且find-all-refs包含了 good )。
  • 在(0)处重命名应该重命名除了引入的别名 gold 之外的所有内容。目前就是这样做的。Find-all-refs包含了对 gold 的引用,这并不是很好,但还可以接受。
mf98qq94

mf98qq948#

请注意,这仅影响VS(和emacs),不影响VS Code。我认为新的providePrefixAndSuffixTextForRename方法可以避免这个bug。

ttp71kqs

ttp71kqs9#

进一步调查显示,服务器有以下情况:

  1. 有一个配置了所有文件(除了一个)的项目。
  2. 一个推断出的项目,其中包含了遗漏的文件。
    推断出的项目提供了两个错误的引用。我还没有调查过这部分。我认为因此这个问题的优先级相当低,尽管我会和@amcasey确认这种设置的普遍性。
    换句话说,如果从上面的tsconfig中删除"include"列表,或者将其添加为"app.tsx",则不会重现此问题。

相关问题