2016-05-17 74 views
4

打字稿是否支持結構類型兼容性的直接測試?打字稿類型兼容性測試

C#支持is運營商和類型的表面IsAssignableFrom(object instance)

if (foo is SomeType) ... 
if (SomeType.IsAssignableFrom(foo)) ... 

有沒有在打字稿進行這種檢查的一些直接的方式或者我有探測所需的每一個成員的?

instanceof可能會爲手頭的情況做,但不尊重結構兼容性,而是檢查原型鏈。

是的,我知道,Typescript的instanceof直接等價於C#的is運算符。但我確實從指定結構類型開始。

也許我應該把一個江湖方法上Object

回答

1

我相信這裏的合適的答案是

沒有,但!

所以爲了避免這種情況發生,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函數以處理元數據。如果我沒有記錯,這仍然存在類型存儲爲字符串的問題,如果你有子類型,它們將不匹配。


無論如何,我希望有所幫助。對不起,我不能給你一個簡單的答案。知道我的運氣,你實際上只是在尋找作業;)

+0

不,你的解釋是現貨。我確實需要運行時分配兼容性檢查。應用程序正在解析數據庫中的字符串。它從一個簡單的X開始,然後突變成一個數組[X,Y,Z]。然後是定義比較器和基元數組的對象{「Comparator」:「any」,「Values」:[X,Y,Z]}。根據年齡的不同,字符串可能包含任何這些東西,因此我將它解析爲JSON,然後計算出在對遺留編碼進行規範化之前得到的結果 - 基元或基元數組提供了值,比較器是「any」。 –