2017-06-16 87 views
0

讓我們先從一些代碼:如何判斷TypeScript對象的類型?

export function toArrayStrict(obj: Iterable<any>): any[] { 
    if(obj) { 
     if(isArray(obj)) { 
      return obj; // error TS2322: Type 'Iterable<any>' is not assignable to type 'any[]'. 

     } 
     if(isFunction(obj[Symbol.iterator])) { 
      return [...obj]; 
     } 
    } 
    throw new Error(`Cannot convert ${getType(obj)} to array; it is not iterable.`); 
} 

這是拋出一個錯誤,當我嘗試編譯:

錯誤TS2322:類型「可迭代」是不能分配給類型「任何[]」 。

我完全得到。它不知道我已驗證obj實際上是any[]

我的問題是,我如何告訴編譯器isArray正在檢查類型,這實際上是安全的?

注意,我知道如果我用Array.isArray代替,錯誤將消失。這個問題不是關於這個問題。我想知道我怎麼告訴tsc這是什麼類型。

回答

1

您需要使用User-Defined Type Guards

function isArray(obj: any): obj is Array<any> { 
    return obj instanceof Array; 
} 

function isFunction(obj: any): obj is Function { 
    return typeof obj === "function"; 
} 

if (isArray(obj)) { 
    return obj; // should be fine now 
} 
+0

噢人,這是真棒!我實際上並沒有想到TS會爲此提供解決方案。剛發現我可以[壓制](https://github.com/Microsoft/TypeScript/issues/9448#issuecomment-229739856)這個錯誤,但是這樣好多了。 – mpen

+1

使用'any'會導致您失去類型安全。只有當你沒有別的選擇時,你才應該這樣做。 –

相關問題