2017-09-14 152 views
1

我擴展Number對象,所以會有一個函數toKM(),它將距離(以米爲單位)轉換爲公里。Typescript奇怪的行爲擴展數

當我使用下面的語法(IMO是默認的Typescript),函數不起作用。

interface Number { 
 
    toKM(): number 
 
} 
 

 
Number.prototype.toKM =() => { 
 
    return this/1000 
 
} 
 

 
let alfa = 3456 
 
document.write(alfa.toKM())

當我用 「傳統」 形式:

interface Number { 
 
    toKM(): number 
 
} 
 

 
Number.prototype.toKM = function() { 
 
    return this/1000 
 
} 
 

 
let alfa = 3456 
 
document.write(alfa.toKM())

是否有一個特殊的情況下,新的語法不工作?

回答

3

如果使用箭頭功能打字稿將抓住這個從聲明背景下,如果你的目標下面ES6你的代碼被編譯成這樣:

var _this = this; 
Number.prototype.toKM = function() { 
    return _this/1000; 
}; 

箭頭的功能就不用工作時,如果你使用純JS(es2015或以上),因爲他們的行爲將等同於上面的JS。

您需要使用常規的功能,並指定的this

Number.prototype.toKM = function(this: number) { 
    return this/1000 
} 
+0

類型這不只是一個打字稿的事情,如果你編譯它ES6和使用真正的箭功能,您將得到同樣的事情。 –

+0

@NitzanTomer你是對的,我是在TS模式下,並沒有考慮JS,增加了澄清 –

+0

@NitzanTomer TSC正在編譯「target」代碼:「es6」。 –