使用TypeScript编译器API从类型引用节点获取类型别名声明节点

使用TypeScript编译器API从类型引用节点获取类型别名声明节点,typescript,tsc,typescript-compiler-api,Typescript,Tsc,Typescript Compiler Api,我正在使用ts morph,它反过来使用ts编译器API 我有这样的代码: export type Foo = string export const foo: Foo = 'bar' 当我查找导出foo的类型时,我得到string。但我真正想要的是类型别名声明类型 foo导出的节点类型是可变声明。从那以后,我知道了怎么去火车站。从那里我有一个方法来获取引用的名称。在这种情况下,“Foo”。但我不知道现在如何从这个名称转到类型别名声明。假设我们不知道“Foo”类型别名的位置。如何动态地找到它?

我正在使用ts morph,它反过来使用ts编译器API

我有这样的代码:

export type Foo = string
export const foo: Foo = 'bar'
当我查找导出
foo
的类型时,我得到
string
。但我真正想要的是类型别名声明类型


foo
导出的节点类型是可变声明。从那以后,我知道了怎么去火车站。从那里我有一个方法来获取引用的名称。在这种情况下,
“Foo”
。但我不知道现在如何从这个名称转到类型别名声明。假设我们不知道
“Foo”
类型别名的位置。如何动态地找到它?

在这种特定情况下是不可能的。TypeScript编译器出于性能原因实习某些类型

出于性能原因,我们尽可能地对类型进行实习(这样我们就避免了对等效类型重复工作)。我们目前不实习匿名对象类型,尽管我们以前也做过实验。不幸的是,插入对象类型有一个副作用,就是打破了插入类型的“转到”定义;所以我们没有把它拉进来。我们今天实习的特定类型是索引访问、并集和交集(也是反向映射类型,但只有推理才能产生这些类型)。这是一个折衷方案——在实习类型上,原产地信息丢失;但大多数时候我们确实避免了很多工作

所以这里,
Foo
被实习为
string
,因为它们是等价的。我在TypeScript回购协议中提到,出于分析原因,是否可以禁用此行为,但尚未得到响应

要使其发挥作用,您可以做的一个技巧是将代码更改为使用品牌,而不是仅使用
string

export type Foo = string & { __FooBrand?: undefined };
export const foo: Foo = 'bar';
其他链接:


    • 在这种特殊情况下不可能。TypeScript编译器出于性能原因实习某些类型

      出于性能原因,我们尽可能地对类型进行实习(这样我们就避免了对等效类型重复工作)。我们目前不实习匿名对象类型,尽管我们以前也做过实验。不幸的是,插入对象类型有一个副作用,就是打破了插入类型的“转到”定义;所以我们没有把它拉进来。我们今天实习的特定类型是索引访问、并集和交集(也是反向映射类型,但只有推理才能产生这些类型)。这是一个折衷方案——在实习类型上,原产地信息丢失;但大多数时候我们确实避免了很多工作

      所以这里,
      Foo
      被实习为
      string
      ,因为它们是等价的。我在TypeScript回购协议中提到,出于分析原因,是否可以禁用此行为,但尚未得到响应

      要使其发挥作用,您可以做的一个技巧是将代码更改为使用品牌,而不是仅使用
      string

      export type Foo = string & { __FooBrand?: undefined };
      export const foo: Foo = 'bar';
      
      其他链接:


      对于好奇的人,这个问题的上下文来自。对于好奇的人,这个问题的上下文来自。谢谢!我跟进了GitHub TS问题。谢谢所有的参考资料。我真的很感激!!谢谢我跟进了GitHub TS问题。谢谢所有的参考资料。我真的很感激!!