首页 > 解决方案 > 如何使用 typescript 正确编写 getParent

问题描述

所以我有两个模型:RootStoreProjectsModel

const RootStore = types
  .model({
    user: types.maybeNull(User),
    projects: ProjectsModel,
  })

ProjectsModel我有一个需要 root 用户属性的操作

const ProjectsModel = types
  .model({...})
  .actions((self) => ({
    loadStarred: flow(function* () {
      const u = getParent(self).user;      < here
      //....

我正在使用 TS 并且 TS 不喜欢它:

Property 'user' does not exist on type '(object & IStateTreeNode<IAnyComplexType>) | IStateTreeNode<IAnyStateTreeNode>'.

好的,我想我需要输入 getParent?

const u = getParent<Instance<typeof RootStore>>(self).user;

哦不,它更不喜欢它

'ProjectsModel' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
'RootStore' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.

自引用在哪里?如何正确输入 getParent?

标签: typescriptmobxmobx-state-tree

解决方案


我想你只需要在<typeof RootStore>那里使用:

import { types, getParent } from 'mobx-state-tree';

const ProjectsModel = types
  .model({
    something: types.string
  })
  .actions((self) => ({
    loadStarred: () => {
      const { user } = getParent<typeof RootStore>(self);

      // typed as User, no errors
      console.log(user?.name);
    }
  }));

const User = types.model({
  name: types.string
});

const RootStore = types.model({
  user: types.maybeNull(User),
  projects: ProjectsModel
});


推荐阅读