typescript - 如何使用 typescript 正确编写 getParent
问题描述
所以我有两个模型:RootStore
和ProjectsModel
:
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?
解决方案
我想你只需要在<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
});
推荐阅读
- angularjs - 如何在 AngularJS 1.5.11 中过滤两个(仅在视觉上)连接的表达式
- react-native - 反应原生搜索过滤器,使用搜索和列表打开模式以选择
- android - QML Drawer 在智能手机上无法正常工作
- html - 引导网格系统中的 iframe 不起作用
- javascript - setTimeout 中的所有函数不是在全局范围内执行吗?
- selenium - Lambda groovy 函数列表
getText 未编译 - android - 登录表单不会显示在我的 WebView 中
- angularjs - 如何在 Heroku 上使用 Node 托管 AngularJS
- excel - VBA Excel根据列中的值删除行,如果为空则继续
- android - 使用滑动和选择/触摸