2017-10-21 76 views
3

我有爲我的打字稿服務器API定義的接口,並且在通過MobX狀態樹定義模型時我希望確保打字稿編譯器強制模型快照符合這些接口。確保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; 

但這似乎並沒有被工作正常。

回答

3

正確的答案是使用.SnapshotType 不幸的是,由於缺少TypeScript中的條件類型,我們無法完全確定。

最多,那麼你需要手動定義接口:(

在這裏你可以跟蹤進度:)

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

+0

是的,花了一些時間在打字稿上探索之後,我發現我不能只依靠MST來生成界面。我主要是在尋找一種方法來確保在寫完接口之後,我可以確保它們不會偏離我的模型定義。 – lorefnon

+0

無論如何,謝謝你的回答以及MST上的所有驚人的工作。 – lorefnon

1

你想Foo.SnapshotType

這樣:

type IFooSnapshot = typeof Foo.SnapshotType 
+0

SnapshotType是不夠的問題,因爲它只是所有鍵映射到任何。所以如果model是'Foo = types.model({name:types.string,addresses:types.array(Address)})''SnapshotType'就像'interface {name ?: any;地址?:任何}'。我的API接口比較嚴格。 'interface {name:string,addresses:[IAddress]}' – lorefnon

+0

嗯,我認爲他們映射到任何必須是一個錯誤,你可以報告它作爲一個問題:https://github.com/mobxjs/mobx-state - 樹/問題並將其鏈接回此處。我也注意到它們被映射到任何地方,但我認爲這與我的設置有關。 – mikeysee

+1

是的,這是https://stackoverflow.com/a/46871448/476712中提到的限制。 – lorefnon

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接口(或者鍵被移除),那麼如果我的客戶機模型沒有相同的鍵,打印機將無法編譯。

+0

如果在t.model(「Foo」,模式)之後添加更多.props()或.views()方法會怎樣?那麼架構不會考慮這些觀點或道具?也許模式不同於快照,因爲它不包含視圖道具? – mikeysee

+0

是的,如果我使用道具,那麼我將不得不將IFoo分成多個接口,並使用一種新的類型,這些類型在我的API合約中是它們的聯合。關於觀點,這對我來說並不是真正的問題,因爲當與服務器交換數據時,我絕不會發送/接收派生數據,所以從API合同的角度來看,通過視圖公開的派生數據是無關緊要的。 – lorefnon

+0

@lorefnono也許你可以提交一份公關給MST文檔,將它添加到Typescript部分,因爲我認爲幾乎每個TS開發人員都會遇到(我做過),而且你的解決方案是一個很好的臨時措施,直到問題117已被排序。 – mikeysee