如何在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
相关产品推荐
相关产品推荐

