React Native新架构Turbo Module自定义类型定义及报错解决咨询
解决Turbo Module Spec中自定义类型不被Codegen识别的问题
方案1:直接使用可序列化的对象字面量接口
Codegen仅能识别基础类型、数组、标准对象字面量、$ReadOnly修饰的对象这类可序列化类型,自定义类无法被解析。你可以把自定义类替换成TypeScript接口:
// file: NativeCustomSpec.ts import type { TurboModule } from 'react-native'; // 用接口定义可序列化的配置结构 interface MyCustomConfig { stringField: string; stringField2: string; boolField: boolean; numberField: number; } export interface Spec extends TurboModule { initialize(configs: MyCustomConfig): Promise<void>; }
这样Codegen就能正确解析类型,原生端会自动生成对应结构体(iOS为Swift结构体/OC字典,Android为Kotlin数据类/Java HashMap)。
方案2:使用Codegen官方推荐的只读对象类型
如果需要确保配置对象不可修改,可以用Codegen.Object包裹类型定义,这是官方推荐的规范写法:
import type { TurboModule, Codegen } from 'react-native'; type MyCustomConfig = Codegen.Object<{ stringField: string; stringField2: string; boolField: boolean; numberField: number; }>; export interface Spec extends TurboModule { initialize(configs: MyCustomConfig): Promise<void>; }
方案3:保留类结构的兼容写法(不推荐)
如果一定要保留类定义,需要先修复类的语法错误(原代码中stringField2: ''缺失类型声明),再将类实例类型转换为Codegen可识别的结构:
import type { TurboModule } from 'react-native'; class CastledConfig { stringField: string = ''; stringField2: string = ''; // 修复类型缺失问题 boolField: boolean = false; numberField: number = 0; } // 将类实例类型转换为接口类型供Codegen解析 type MyCustomConfig = InstanceType<typeof CastledConfig>; export interface Spec extends TurboModule { initialize(configs: MyCustomConfig): Promise<void>; }
关键提示
新架构的Turbo Module无需再使用传统的ReadableMap,Codegen会自动完成JS对象到原生类型的转换,前提是你的类型仅由可序列化的基础类型组合而成;避免在spec中使用自定义泛型、函数类型或不可序列化的复杂类型,Codegen仅支持有限的类型集合。
内容的提问来源于stack exchange,提问作者1987frank
相关产品推荐
相关产品推荐

