确保 MobX 状态树模型中的接口合规性

Ensuring interface compliance in MobX State tree models

我为我的打字稿服务器 API 定义了接口,当通过 MobX 状态树定义模型时,我想确保打字稿编译器强制模型快照符合这些接口。

因此,如果将额外的 属性 添加到 IFoo 接口,但未添加到 Foo MST 模型,则希望在编译时让打字稿抱怨它.

执行上述内容的最佳方式是什么?


我知道我可以从模型本身获得有效的打字稿接口:

type IFoo = typeof Foo.Type

我不想为我的服务器 API 使用此界面,因为:

  1. 在本质上处理快照(普通对象)的 API 接口中有 IObservableIComplexType 等东西是不可取的。

  2. 因此,派生的接口也具有用于不需要的操作的方法签名。


我曾尝试过类似的东西:

// IFoo is my server interface
const T = t.model("Foo", {...})

type IT = typeof T.Type;

type ISnapshot<T> = {[K in keyof T]?: T[K];}
export const Foo : IModelType<ISnapshot<IFoo>, IT> = T;

但这似乎没有按预期工作。

你想要Foo.SnapshotType

所以:

type IFooSnapshot = typeof Foo.SnapshotType

作为临时解决方案,我做了以下操作:

import { IType } from "mobx-state-tree";

export type ISchema<T> = {[K in keyof T]: IType<any, any>;}

在定义我的模型时:

const schema: ISchema<IFoo> = { ... }
export const Foo = t.model("Foo", schema)

这不像我希望的那样类型安全(这就是为什么我不接受这个答案)。

但是,在所有模型中始终遵循此模式可以解决我的主要目的,即。如果新闻键被添加到 API 接口(或键被删除),如果我的客户端模型没有相同的键,打字稿将无法编译。

正确的答案是使用 .SnapshotType 不幸的是,由于 TypeScript 中缺少条件类型,我们无法准确提供。

到那时你需要手动定义你的界面:(

这是您可以跟踪进度的问题:)

https://github.com/mobxjs/mobx-state-tree/issues/117