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

时间:2017-10-21 21:45:50

标签: mobx mobx-state-tree

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

因此,如果将另一个属性添加到IFoo接口,但未添加到Foo MST模型,则需要在编译时让typecript对其进行抱怨。

执行上述操作的最佳方法是什么?

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

type IFoo = typeof Foo.Type

我不想将此接口用于我的服务器API,因为:

  1. 不希望在API接口中使用IObservableIComplexType等内容来处理快照(普通对象)。

  2. 因此派生的接口也有不适合的动作的方法签名。

  3. 我尝试过类似的事情:

    // 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;
    

    但这似乎没有像预期的那样发挥作用。

3 个答案:

答案 0 :(得分:3)

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

到目前为止,您需要手动定义界面:(

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

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

答案 1 :(得分:1)

你想要Foo.SnapshotType

这样:

type IFooSnapshot = typeof Foo.SnapshotType

答案 2 :(得分:1)

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

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接口(或删除了密钥),那么如果我的客户端模型没有相同的密钥,则typescript将无法编译。