Kotlin/JS中如何实现判断reified泛型类型T是否为枚举类的函数
Kotlin/JS 实现枚举类判断方案
原代码错误原因
你编写的代码存在逻辑错误:KClass.isInstance()的作用是判断传入参数是否为当前类的实例,你将Enum类本身作为参数传入判断,逻辑完全倒置,因此永远返回false。
另外Kotlin/JS默认没有携带全量KClass反射元数据,直接照搬JVM端的T::class.isEnum写法也无法直接生效。
可行实现方案
方案1:轻量无反射实现(推荐)
直接利用Kotlin/JS编译生成的内置元数据判断,不需要引入额外依赖,不会增加包体积:
inline fun <reified T : Any> isEnum(): Boolean { // 直接读取Kotlin编译到JS后附加的类元数据标记 return js("T?.\$metadata$?.kind === 'enum_class'") as Boolean }
调用测试完全符合预期:isEnum<String>()返回false、isEnum<MyObject>()返回false、isEnum<MyEnum>()返回true。
方案2:全量反射实现
如果项目已经引入了kotlin-reflect-js全量反射库,可以直接使用标准反射API:
import kotlin.reflect.full.isEnum inline fun <reified T : Any> isEnum(): Boolean = T::class.isEnum
注意该方案需要引入全量反射依赖,会增加最终打包的JS体积。
内容的提问来源于stack exchange,提问作者vonox7
相关产品推荐
相关产品推荐

