我相信這裏的合適的答案是
沒有,但!
所以爲了避免這種情況發生,Typescript的類型信息僅在編譯時才存在。在運行時沒有辦法檢查結構相等性。你當然可以在編譯時做這個檢查,但這只是所謂的分配,可能不是你所問的。長篇小說,你必須探討所需的成員(通常),但有幾種方法可以巧妙地解決這個問題。
作爲打字稿1.6語言的支持user-defined type guards
這些是精彩作爲方便函數中,是安全地向下轉換/指定/精煉型(取決於你的優選的術語)的一種方式。如果您希望以典型的方式(.hasOwnProperty
等),您可以手動檢查是否存在某些類型,根據我的經驗,它們作爲在消息類型上分派的方式更有效。在大多數消息傳遞系統中,您可能有一個type屬性。你可以定義一個函數
function isConfigGetMsg(msg: BaseMessage): msg is ConfigGetMsg {
return msg.name === MsgTypes.CONFIG_GET_MSG;
}
//and use it as
if (isConfigGetMsg(msg)){
console.log(msg.key); //key being a ConfigGetMsg only value
}
只要你的消息格式正確,這就好了。雖然你可以看到你需要測試特定的信息。如果你想要一個更普遍的方法,這不是問題。
正如您所提到的,您可以探測每個必需的成員。您可以通過使用以前的技術,這樣創造的東西讓自己更容易一點:
interface One {
a: number
}
interface Two extends One {
b: string
}
function isAssignableTo<T>(potentialObj:Object, target:T) : potentialObj is T {
return Object.keys(target).every(key => potentialObj.hasOwnProperty(key))
}
let a: Object = {
a: 4,
b: 'hello'
};
let b: Two = undefined;
if(isAssignableTo(a, b)) {
b = a;
}
的isAssignableTo
功能是關鍵點在這裏。參數應該在的方向是有爭議的,但也是不相關的,所以不管你喜歡如何。這不是一個理想的解決方案。您可能希望事物僅基於非函數屬性進行分配,例如,暗示狀態而不是通用功能。你可以嘗試擴展檢查來解決這個問題,但是不管怎麼說都有缺陷。
我很抱歉地說,我相信唯一的「真實」的答案是不可行的。如果您正在使用類,則可以使用裝飾器來捕獲有關應用程序的元數據,包括稍後可用於反射/檢查的類型信息。您可以創建自己的裝飾器來執行此操作,但您也可以使用typescript's own metadata generation for class properties.,您可以使用tsconfig標誌打開它。
此處假定metadata reflection api存在。你需要使用它來提取這些信息。然後,您可以從早期重寫isAssignableTo函數以處理元數據。如果我沒有記錯,這仍然存在類型存儲爲字符串的問題,如果你有子類型,它們將不匹配。
無論如何,我希望有所幫助。對不起,我不能給你一個簡單的答案。知道我的運氣,你實際上只是在尋找作業;)
。
不,你的解釋是現貨。我確實需要運行時分配兼容性檢查。應用程序正在解析數據庫中的字符串。它從一個簡單的X開始,然後突變成一個數組[X,Y,Z]。然後是定義比較器和基元數組的對象{「Comparator」:「any」,「Values」:[X,Y,Z]}。根據年齡的不同,字符串可能包含任何這些東西,因此我將它解析爲JSON,然後計算出在對遺留編碼進行規範化之前得到的結果 - 基元或基元數組提供了值,比較器是「any」。 –