2014-09-12 22 views
0

我試圖爲Typescript構建一個更好的投射模型來捕捉無效類型的投射。我想盡可能保持簡單,所以消費者不必提供不必要的論據,但似乎打字稿仿製藥並不真正允許我想要做什麼......爲Typescript構建一個更好的投射系統

這是我想要的該函數的樣子:

module cast { 
    export function to<T>(obj : any) : T { 
     if (obj instanceof T) { 
      return <T>obj; 
     } 

     throw new Error("Nope..."); 
    } 
} 

// Usage 
var animal: Animal = getAnimal(); 
var mySnake = cast.to<Snake>(animal); 

不幸的是,據我知道你不能在函數體內引用泛型參數,所以我能做的最好的是:

module cast { 
    export function to<T>(f : Function, obj : any) : T { 
     if (obj instanceof f) { 
      return <T>obj; 
     } 

     throw new Error("Nope..."); 
    } 
} 

// Usage 
var animal: Animal = getAnimal(); 
var mySnake = cast.to<Snake>(Snake, animal); 

該作品,但我不是這個創造的簽名的粉絲。參數是多餘的。任何人都知道一種方法來使這個工作瓦特/只引用一次類型?

回答

4

啊哈!想通出來...

module cast { 

    export function to<T>(type: { new(any): T }, obj: any) { 
     if (obj instanceof type) { 
      return <T>obj; 
     } 

     throw new Error('Invalid cast'); 
    } 

    export function as<T>(type: { new (any): T }, obj: any) { 
     if (obj instanceof type) { 
      return <T>obj; 
     } 

     return undefined; 
    } 
} 

// Usage 
var animal: Animal = getAnimal(); 

// if animal isn't a snake, then throw an exception 
var mySnake = cast.to(Snake, animal); 

// if animal isn't a snake, then create a new instance 
var other = cast.as(Snake, animal) || new Snake(); 

通用T從t的值推斷出,因此它不僅具有作爲第一個參數,而不是在通用參數被提供。還沒有真正測試這超出Typescript Playground,但看起來應該工作...

更新:添加'as'函數返回'undefined'如果強制轉換無效。

+0

我喜歡這個。可能想要返回null而不是拋出異常。如果我不在意如果它不是一條蛇,我就會拋棄它,只會將它拋到並希望最好。你怎麼看? – user1852503 2014-09-12 14:51:06

+0

我同意。我實際上創建了第二種方法(見上面的編輯) – jt000 2014-09-12 15:01:44

+0

恕我直言,未定義意味着這個變種沒有被設置。 null意味着'我不知道它是什麼'。 – user1852503 2014-09-12 15:23:33

相關問題