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

如何在Kotlin/JS中声明外部TypeScript类型(适配react-admin)

Kotlin/JS 适配 react-admin ra-core 类型声明实现方法

Kotlin/JS 对接外部TypeScript库的类型,统一使用external修饰符做编译期映射,不需要编写实现逻辑,编译器会自动对齐JS侧的对象结构。以下是对应AuthProvider和DataProvider类型的完整声明方案。

前置依赖基础类型声明

首先声明两个核心类型依赖的基础结构,可根据业务需求按需扩展字段:

import kotlin.js.Promise

// 对应ra-core的RaRecord基础实体类型
external interface RaRecord {
    val id: Any // ra中id支持number/string两种类型,用Any覆盖
}

// 对应ra-core的UserIdentity用户身份类型
external interface UserIdentity {
    val id: Any
    val fullName: String?
    val avatar: String?
}

// 列表查询参数
external interface GetListParams {
    val pagination: Pagination
    val sort: Sort
    val filter: Any?
    val meta: Any?
}
external interface Pagination {
    val page: Int
    val perPage: Int
}
external interface Sort {
    val field: String
    val order: String // 取值为"ASC" / "DESC"
}

// 列表查询返回结果
external interface GetListResult<RecordType: RaRecord> {
    val data: Array<RecordType>
    val total: Int?
    val pageInfo: PageInfo?
}
external interface PageInfo {
    val hasNextPage: Boolean
    val hasPreviousPage: Boolean
}

// 单条查询参数
external interface GetOneParams {
    val id: Any
    val meta: Any?
}

// 单条查询返回结果
external interface GetOneResult<RecordType: RaRecord> {
    val data: RecordType
}

AuthProvider 类型声明

对齐TS中AuthProvider的结构,处理可选方法、索引签名、联合返回类型的映射:

external interface AuthProvider {
    fun login(params: Any?): Promise<Any?>
    fun logout(params: Any?): Promise<Any?> // 覆盖返回值void | false | string的联合类型
    fun checkAuth(params: Any?): Promise<Unit>
    fun checkError(error: Any?): Promise<Unit>
    fun getIdentity(): Promise<UserIdentity>? // 可选方法加?标记
    fun getPermissions(params: Any?): Promise<Any?>

    // 对应TS的 [key: string]: any 字符串索引签名,支持自定义扩展方法
    operator fun get(key: String): Any?
    operator fun set(key: String, value: Any?)
}

DataProvider 泛型类型声明

对齐带泛型约束、泛型默认值、方法级泛型的DataProvider结构,其余方法可按相同规则补充:

// 对应TS的 DataProvider<ResourceType extends string = string>
external interface DataProvider<ResourceType: String = String> {
    // 对应方法级泛型 <RecordType extends RaRecord = any>
    fun <RecordType: RaRecord> getList(
        resource: ResourceType,
        params: GetListParams
    ): Promise<GetListResult<RecordType>>

    fun <RecordType: RaRecord> getOne(
        resource: ResourceType,
        params: GetOneParams
    ): Promise<GetOneResult<RecordType>>

    // 其余getMany/update/create/delete等方法可按照ra-core的类型定义,用相同规则补充即可

    // 同AuthProvider支持自定义扩展方法,加索引签名
    operator fun get(key: String): Any?
    operator fun set(key: String, value: Any?)
}

适配注意事项

  • 类型映射特性:所有external修饰的声明仅做编译期类型校验,不会生成额外JS代码,运行时完全和原生JS对象行为一致
  • any类型选择:TS中的any类型可按需选择:需要基础类型校验时用Any?,需要灵活扩展、减少强转时用dynamic跳过编译期检查
  • 可选成员规则:TS中带?的可选属性/方法,在Kotlin声明中在成员名后加?即可,编译器会自动处理undefined场景
  • 泛型适配:TS泛型默认值语法和Kotlin泛型默认值语法完全一致,直接在泛型声明后加= 类型即可;TS的字符串字面量泛型约束,在Kotlin/JS中用String作为上界即可正常工作

内容的提问来源于stack exchange,提问作者frhack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:36:20