4

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

因此,如果一个附加属性被添加到IFoo接口中,但没有添加到FooMST 模型中,那么最好让 typescript 在编译时抱怨它。

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


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

type IFoo = typeof Foo.Type

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

  1. 不希望在本质上处理快照(普通对象)的 API 接口中包含诸如等之IObservable类的东西。IComplexType

  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;

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

4

3 回答 3

3

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

到那时你需要手动定义你的接口:(

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

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

于 2017-10-22T07:11:52.437 回答
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 接口(或删除键),那么如果我的客户端模型没有相同的键,打字稿将无法编译。

于 2017-10-22T05:57:37.777 回答
1

你想要 Foo.SnapshotType

所以:

type IFooSnapshot = typeof Foo.SnapshotType
于 2017-10-22T03:56:42.923 回答