2017-07-28 30 views
1

有人能告訴我如何archieve的情況,在那裏同樣TS - 如何恢復老--noImplicitAny行爲

let x; 

代碼將拋出一個異常,並不會散發呢?我真的更喜歡2.1之前的TS版本的行爲。也許TSlint可以解決我的問題?

回答

0

不同之處在於,自從2.1版分配到x以後,它將推斷出實際類型,而不僅僅是使用any。在將號碼分配給x之前,它可能看起來有any的類型,但實際上嘗試使用它,您會發現它的類型undefined開頭。

它不會顯示在您的單行示例中,但在分配給x之前,您只能將其用作undefined,並且在分配給它之後,類型會相應地擴大或更改。

考慮以下代碼:

function foo(z: boolean) { 
    let x; 
    if (x) { // Editor sees the type here as `undefined` 
    x.foo(); // Error here, the type of `x` is now `never` 
    } 

    x = 3;  // `x` now has type `number` 
    if (z) { 
    x = 'foo'; // `x` now has type `string` 
    } 
    let y = x; // Both `x` and `y` now have type `string|number` 
    console.log(y.toFixed()); // Error, `toFixed` does not exist on `string|number` 
} 

更改定義let x:any;這個代碼將編譯毫無怨言,因爲這裏的x類型真的是any

function foo(z: boolean) { 
    let x: any; 

    x = 3; 
    if (z) { 
    x = 'foo'; 
    } 
    let y = x; 
    console.log(y.toFixed()); 
} 

類型的y是明確any,因爲它是從x類型推斷。

所以回到你的一個班輪:

let x; 

這一點,因爲推斷出的類型是undefined不是隱含any

並回答這個問題,不,你不能關閉類型推斷。

+0

謝謝。特別是你的最後一句話幫助我很多:)。但我必須要有點固執。有沒有辦法通過使用TSLint或類似的東西來轉向類型推斷?提前致謝 :) – Crova