4

我正在制作一个命令行 nodejs 工具,它使用 Typescript 语言服务自动重命名 Typescript 文件中的符号。

您告诉工具:将此类型的所有符号重命名为此符号。就像 resharper 一样,它也会重命名局部变量、属性等。由于它允许一次重命名多个符号,您还可以交换两个符号名称,而无需中间的临时唯一名称(例如,将 Foo 重命名为 Bar,反之亦然)。

我必须公开语言服务中的私有函数 getSymbolInfoAtPosition 才能使其工作,这样我才能获得 PullSymbol 信息

目前,它仅通过在 PullSymbol 上调用 getNameAndTypeName 来检测确切的名称+类型匹配,但我想执行结构上兼容的匹配。

在 C# 中,这很容易,因为 Type 具有 IsAssignableFrom 方法。

有谁知道如何使用 Typescript 编译器即服务来检测一个 PullSymbol 在结构上是否与另一个 PullSymbol 兼容?

非常感谢,彼得 Verswyvelen

4

2 回答 2

2

基本上,看起来您并没有全面检查一种类型是否可以仅通过反射分配另一种类型。检查一种类型是否可分配给另一种类型的功能已经在 typescript 中实现,它只是没有公开公开,并且没有真正的方法可以在不手动更改 typescript 库的情况下获得它。

一种直接的解决方法是有效地编译临时代码以将一个分配给另一个,并查看是否存在编译错误。

我的公开请求的回应isTypeAssignableTo是有利的,所以希望答案会在短期内改变。

[更新] 看起来它最终确实在合并中暴露了......虽然我没有尝试过:https ://github.com/microsoft/TypeScript/pull/33263/files#diff-c3ed224e4daa84352f7f1abcd23e8ccaR525-R527

于 2016-10-28T22:03:42.667 回答
-1

我不确定与 C#isAssignableFrom方法的直接比较是什么,但也许您可以编写自己的逻辑来创建该函数 -

isAssignableFrom(pullSymbol): boolean {
    ....
    if (typeof pullSymbol === 'string') {
        // Is compatible with any type that allows strings
    }
    ....
}

您可以在此处阅读一些语言规范以找到以下内容:

The Any type is a supertype of all types, and is assignable to and from all types.

将这些信息与一些硬编码逻辑一起使用可能是您的解决方案。

于 2014-10-31T14:07:13.230 回答