2017-09-14 137 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”。 –