TypeScript 声明 emit 包含琐碎的本地重复项

nc1teljy  于 4个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(36)

Bug报告

🔎 搜索词

declaration emitdtsinlineinliningduplication

🕗 版本与回归信息

  • 在所有我尝试的版本中,都存在这种行为。

⏯ Playground链接

包含相关代码的Playground链接

💻 代码

export const I = {
    /**
* Docs
*/
    prop: true
};

export const Inlined           = I;
export const Aliased: typeof I = I;

🙁 实际行为

声明emit包含重复的类型。

export declare const I: {
    /**
* Docs
*/
    prop: boolean;
};
export declare const Inlined: {
    /**
* Docs
*/
    prop: boolean;
};
export declare const Aliased: typeof I;

🙂 预期行为

声明emit应该通过别名引用原始类型。

export declare const I: {
    /**
* Docs
*/
    prop: boolean;
};
export declare const Inlined: typeof I;
export declare const Aliased: typeof I;

注意事项

我知道这是按预期工作的,所以如果没有快速解决的办法,请立即关闭。
我们有很多文档因为这个特定的简单文件内部变体而变得冗长,这是更一般化的重复/内联问题的一个特定示例。当进行类型重命名或迁移时,它们需要以不同的名称导出,这时就会发生这种情况。解决方法是显式添加 typeof X 注解,但人们常常忘记这一点。
长期的解决方案是采用 --isolatedDeclarations 并使用完全不同的声明emit形式,但在短期内,对于喜欢推断的人来说,也许还有一种快速修复现有声明emit的方法?

iklwldmw

iklwldmw1#

我原则上对此没有任何担忧:如果初始化器是一个导出的裸标识符,那么似乎完全可以安全地重用它的 typeof 代替匿名类型。
然而,这种情况(在这种情况下是安全的)发生得有多频繁呢?我有点惊讶。

f45qwnt8

f45qwnt82#

我注意到这个案例的另一个问题:
如果变量I上有jsdoc注解,内联版本在复制内容时会丢失它们,而别名版本不会。

相关问题