我为我的打字稿服务器API定义了接口,当通过MobX状态树定义模型时,我想确保typescript编译器强制模型快照符合这些接口。
因此,如果将另一个属性添加到IFoo
接口,但未添加到Foo
MST模型,则需要在编译时让typecript对其进行抱怨。
执行上述操作的最佳方法是什么?
我知道我可以从模型本身获得有效的打字稿界面:
type IFoo = typeof Foo.Type
我不想将此接口用于我的服务器API,因为:
不希望在API接口中使用IObservable
,IComplexType
等内容来处理快照(普通对象)。
因此派生的接口也有不适合的动作的方法签名。
我尝试过类似的事情:
// 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;
但这似乎没有像预期的那样发挥作用。
答案 0 :(得分:3)
正确的答案是使用.SnapshotType
遗憾的是,由于TypeScript中缺少条件类型,我们无法完全提供。
到目前为止,您需要手动定义界面:(
以下是您可以跟踪进度的问题:)
答案 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将无法编译。