确保 MobX 状态树模型中的接口合规性
Ensuring interface compliance in MobX State tree models
我为我的打字稿服务器 API 定义了接口,当通过 MobX 状态树定义模型时,我想确保打字稿编译器强制模型快照符合这些接口。
因此,如果将额外的 属性 添加到 IFoo
接口,但未添加到 Foo
MST 模型,则希望在编译时让打字稿抱怨它.
执行上述内容的最佳方式是什么?
我知道我可以从模型本身获得有效的打字稿接口:
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;
但这似乎没有按预期工作。
你想要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 中缺少条件类型,我们无法准确提供。
到那时你需要手动定义你的界面:(
这是您可以跟踪进度的问题:)
我为我的打字稿服务器 API 定义了接口,当通过 MobX 状态树定义模型时,我想确保打字稿编译器强制模型快照符合这些接口。
因此,如果将额外的 属性 添加到 IFoo
接口,但未添加到 Foo
MST 模型,则希望在编译时让打字稿抱怨它.
执行上述内容的最佳方式是什么?
我知道我可以从模型本身获得有效的打字稿接口:
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;
但这似乎没有按预期工作。
你想要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 中缺少条件类型,我们无法准确提供。
到那时你需要手动定义你的界面:(
这是您可以跟踪进度的问题:)