Typescript编译器作为服务:如何测试一种类型是否可以分配给另一种类型?

时间:2014-07-29 11:25:22

标签: typescript renaming automated-refactoring languageservice

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

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

我必须在语言服务public中创建私有函数getSymbolInfoAtPosition以使其工作,这样我才能获得PullSymbol信息

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

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

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

非常感谢, Peter Verswyvelen

2 个答案:

答案 0 :(得分:1)

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

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

my request to expose isTypeAssignableTo has been favorable的回复,希望答案会在短期内发生变化。

答案 1 :(得分:-1)

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

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

您可以阅读一些语言规范here来查找以下内容:

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

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