2014-06-05 34 views
0

以下是僞代碼,但我認爲它使最好的清楚什麼,我試圖做的:有沒有辦法動態檢查類型的instanceof?

class C { 
    public var x: number = 34; 
} 

var enforceType<T> = (x: T) : T { 
    if (x instanceof T) { 
     return x; 
    } else { 
     console.log(x); 
     console.log(T.toString()); 
     throw ("wrong type!"); 
    } 
} 

enforceType<C>({}); // should raise the exception! 

的問題是,T是不是一個類,而是一個類型,所以的instanceof不能正常工作,也沒有toString。但有沒有辦法在運行時檢查一個值是否是一個類型,我有一個編譯時間?

回答

0

但是,有沒有辦法來檢查在運行時的值是否是一個類型我有一個編譯時的

enforceType<C>({});

應該是一個編譯錯誤!

而就是:

class C { 
    public x: number = 34; 
} 

function enforceType<T>(x: T) : T { 
    return x; 
} 

enforceType<C>({}); // compile error! 
+0

好吧,我承認示例(的選擇不當:在我實際的代碼,我真的很想做一個動態檢查,雖然,因爲{}是通過HTTP接收的值 – user2645074

0

我有一個解決方案,但它是相當瘋狂。這個想法是,我通過「幻影對象」的類型檢查功能第一,並在運行時,enforceType將每個對象針對幻影深比較:

var enforceType = (phantom: any) => { 
    return (x: any) => { 
     if (subtypeof(x, phantom)) { 
      return x; 
     } else { 
      console.log("error", x, phantom); 
      throw ("wrong type!"); 
     } 
    } 
} 

var subtypeof = (_sub, _super) => { 
    if (typeof _sub !== typeof _super) { 
     return false; 
    } 

    if (typeof(_sub) === "object") { 
     if (_sub === null || _super === null) { 
      return true; 
     } 

     for (var x in _super) { 
      if (!(x in _sub)) { return false; } 
      if (!subtypeof(_sub[x], _super[x])) { return false; } 
     } 
    } 

    return true; 
} 

class C { 
    constructor(public x: number) { 
     return; 
    } 
} 

var enforceC = enforceType(new C(0)); 

console.log(enforceC({x: 8}));   // no exception. good. 
console.log(enforceC({z: "8"}));  // exception. also good. 

這本質上是一種「yes'-回答我的問題,但我不喜歡它的原因有兩個:

  • 這是一個有點令人費解(但我認爲有可能實現enforceC的(靜態)類的方法,並提供給一個方法一個混合的任意類;這會稍微改善)。

  • 它在運行時對每個對象進行深入比較。對於通過ajax進入的對象來說,這可能是微不足道的,但它絕對是一種可以仔細衡量的基準,或者最好在生產代碼中禁用它。

+0

(仍然希望有人來。告訴我有一個更簡單的方法!:) – user2645074

相關問題