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

Use TypeScript Compiler API to get the Type Alias Declaration Node from a Type Reference Node

我正在使用 ts-morph,后者又使用 TS 编译器 API。

我有这种情况的代码:

export type Foo = string
export const foo: Foo = 'bar'

当我查找 foo 的导出类型时,我得到 string。但我真正想要的是类型别名声明类型。

foo 导出的节点类型是 VariableDeclaration。从那里我想出了如何到达 TypeReferenceNode。从那里我有一个方法来获取引用的名称。在这种情况下 "Foo"。但我不知道现在如何从这个名称转到类型别名声明。假设我们不知道 "Foo" 类型别名的位置。如何动态找到它?

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

For performance reasons, we intern types where possible (this way we avoid duplicating work for equivalent types). We do not currently intern anonymous object types, though we've experimented with it before. Unfortunately, interning object types has the side effect of breaking go to definition on the interned types; so we didn't pull it in. The specific types we intern today are indexed accesses, unions, and intersections (also reverse mapped types, but only inference can produce those). This is a tradeoff - origin information is lost on interned types; but we do avoid quite a bit of work most of the time. - Source

所以在这里,Foo 被保留为 string,因为它们是等价的。我 asked 在 TypeScript 存储库中,如果出于分析原因禁用此行为是可行的,但还没有得到响应。

要使它起作用,您可以采取的一个技巧是更改代码以使用品牌,而不仅仅是 string

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

附加链接: