2016-08-03 39 views
1

我有以下簡單的函數,它接受任何類型的參數,並應該返回一個數字:應該TypeScript保證函數的返回值嗎?

function foo(x:any): number { 
    return x.bar; 
} 

var b = {bar: "shit happens"}; 
console.log(foo(b)); // foo returns 'shit happens' which is not a number. 

看來,如果x.bar不包含一個號碼,然後這個函數的返回值可以是任何東西。

我的問題是:有沒有一種方法可以保證函數的返回值總是一個數字而沒有別的(就像在其他強類型語言中一樣)?如果不是,那麼使用TypeScript的優點是,如果輸入系統只提供了應該使用的優選返回類型的「提示」並允許不正確的返回類型。

回答

4

這裏的問題是您使用的any類型。
基本上,你告訴編譯器「看,我知道我在做什麼,不要檢查我的東西」。
你應該避免使用any,因爲那麼你繞過了編譯器檢查,如果你打算這麼做,那爲什麼不直接使用javascript呢?

如果你不會使用any而是一類或接口,那麼你會得到一個錯誤:

type FooParam = { 
    bar: number; 
} 

function foo(x: FooParam): number { 
    return x.bar; 
} 

var b = { bar: "shit happens" }; 
console.log(foo(b)); 

code in playground

你會在最後一行得到一個錯誤:

Argument of type { bar: string; } is not assignable to parameter of type { bar: number; }

你可以避免這種FooParam類型:

function foo(x: { bar: number }): number { ... }