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

React Native+TypeScript中如何动态为Realm对象设置关联属性?

解决Realm + TypeScript动态赋值关联对象的类型报错问题

这种动态赋值关联对象的操作完全可行,报错是因为TypeScript的类型约束没匹配好——你直接用了Realm.Object的非泛型版本,TS没法推断出relationship对应的属性类型,所以触发了类型错误。

下面是具体的修正方案:

关键修改点

  1. 用泛型绑定对象与属性键:把sourceObject定义为泛型类型,让relationship对应这个泛型对象的合法键,而非宽泛的keyof Realm.Object。
  2. 针对性类型断言:通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:22:55