微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

我有这种情况的代码

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

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

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

解决方法

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

出于性能方面的考虑,我们在可能的情况下实习类型(这样,我们避免了对等同类型进行重复工作)。尽管我们之前已经进行过试验,但是我们目前不实习匿名对象类型。不幸的是,内部对象类型具有打破定义的副作用。因此,我们没有使用它。今天我们实习的特定类型是索引访问,并集和交集(也是反向映射的类型,但只有推理才能产生这些类型)。这是一个折衷方案-实习生类型的原籍信息会丢失;但是我们大部分时间确实避免大量工作。 -Source

因此在这里,Foo被作为string进行了实习,因为它们是等效的。如果出于分析原因禁用此行为是否可行,我将在asked中输入TypeScript存储库,但尚未得到响应。

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

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

其他链接:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。