Kotlin.js导出接口含__doNotUseOrImplementIt:JS能否使用及如何移除?
关于KMM导出JS接口时
__doNotUseOrImplementIt字段的疑问 基础示例
Kotlin代码
@JsExport actual interface DataTransferObject { actual val _type: String get() = "temp" }
生成的JavaScript代码
interface DataTransferObject { readonly _type: string; readonly __doNotUseOrImplementIt: { readonly "info.cotique.rest.commons.DataTransferObject": unique symbol; }; }
补充示例
Kotlin代码
@JsExport interface IdDTO<I: Comparable<I>>: DataTransferObject { var id: I? }
生成的JavaScript代码
interface IdDTO<I extends info.cotique.rest.commons.Comparable<I>> extends info.cotique.rest.commons.DataTransferObject { id: Nullable<I>; readonly _type: string; readonly __doNotUseOrImplementIt: { readonly "info.cotique.rest.commons.IdDTO": unique symbol; } & info.cotique.rest.commons.DataTransferObject["__doNotUseOrImplementIt"]; }
问题解答
1. __doNotUseOrImplementIt是什么?
这是Kotlin/JS导出带@JsExport注解的接口时自动添加的内部类型标识字段。它包含一个唯一的symbol值,用来在JS环境中区分不同Kotlin接口的实例,保证Kotlin类型系统能在JS里正确识别接口实现,避免类型混淆。
2. 为什么提示不应使用或实现此接口?
这个字段是Kotlin/JS的内部实现细节,不属于接口的公开API:
- 依赖它会让代码和Kotlin的JS编译逻辑强绑定,版本更新时字段的实现逻辑可能变动,引发兼容性问题。
- 手动实现该字段会破坏Kotlin类型系统在JS中的正确性,导致类型校验失效,比如Kotlin无法准确判断一个JS对象是否真的符合对应Kotlin接口的要求。
3. 有没有办法让Kotlin停止添加此类字段?
目前没有官方方式可以禁用这个字段。它是Kotlin/JS保障跨语言类型安全的核心机制,移除后会导致Kotlin与JS之间的类型交互出现问题,比如类型转换错误、instanceof判断失效等。如果你的场景不需要严格的Kotlin-JS类型交互,可以考虑放弃@JsExport,手动编写JS互操作代码,但这会失去KMM的代码共享优势。
内容的提问来源于stack exchange,提问作者Vitaliy Tsirkunov
相关产品推荐
相关产品推荐

