React Native+TypeScript中如何动态为Realm对象设置关联属性?
解决Realm + TypeScript动态赋值关联对象的类型报错问题
这种动态赋值关联对象的操作完全可行,报错是因为TypeScript的类型约束没匹配好——你直接用了Realm.Object的非泛型版本,TS没法推断出relationship对应的属性类型,所以触发了类型错误。
下面是具体的修正方案:
关键修改点
- 用泛型绑定对象与属性键:把
sourceObject定义为泛型类型,让relationship对应这个泛型对象的合法键,而非宽泛的keyof Realm.Object。 - 针对性类型断言:通过
objectSchema确认属性类型后,用类型断言告诉TS当前访问的属性具体是什么类型,绕过不必要的类型检查。
修正后的完整代码
async getObjectsAndRestoreRelations<T extends Realm.Object>( objectSchema: Realm.ObjectSchema, objectsUUIDs: UUID[], sourceObject: T | null, relationship: keyof T | null, ) { const getOperation = new GetOperation(objectSchema, objectsUUIDs); const objects: Realm.Object[] = await getOperation.run(); objects.forEach((object) => { if (!relationship || !sourceObject) return; const relationshipProperty = sourceObject.objectSchema().properties[relationship as string] as Realm.ObjectSchemaProperty; if (relationshipProperty.type === 'object') { // 断言属性为可赋值的Realm对象类型 (sourceObject as Record<keyof T, Realm.Object>)[relationship] = object; } else if (relationshipProperty.type === 'array') { // 断言属性为Realm.List类型(Realm的数组关系实际是List,自带push方法) const relatedList = sourceObject[relationship] as Realm.List<Realm.Object>; relatedList.push(object); } }); }
额外说明
- Realm的数组关联不是普通JS数组,而是
Realm.List类型,所以需要断言成这个类型才能调用push方法。 - 泛型
T会自动推导sourceObject的实际类型,TS能更准确地校验relationship的合法性,同时避免动态属性访问的类型错误。
内容的提问来源于stack exchange,提问作者LiohAu
相关产品推荐
相关产品推荐

