You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:57:47