TypeScript JavaScript:默认参数导致类型推断不正确

pu3pd22g  于 6个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(140)

microsoft/vscode#62013

TypeScript 版本: 3.2.0-dev.20181027
搜索词:
代码

对于 javascript:

var SomeObject = {
    SomeFunction: function (SomeInput) {
        return SomeInput * 2;
    },
    SomeOtherFunction: function (SomeOtherInput, SomeOptionalInput = SomeObject.SomeFunction(2)) {
        return SomeOtherInput * SomeOptionalInput;
    }
};

SomeObject

悬停在 SomeObject

错误:

类型是 any 。如果删除默认参数,则类型正确

ocebsuys

ocebsuys1#

看起来是某些原因导致我们在早期就拉取签名类型,这与初始化器有关,取决于对象类型本身,并导致它被标记为循环引用,具体来说,当 noImplicitAny 为真时,我们得到

'SomeObject' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.

错误。事情是,如果你用更符合命名空间的方式写同样的东西:

namespace SomeObject {
    export function SomeFunction(SomeInput) {
        return SomeInput * 2;
    }
    export function SomeOtherFunction(SomeOtherInput, SomeOptionalInput = SomeObject.SomeFunction(2)) {
        return SomeOtherInput * SomeOptionalInput;
    }
}

我们会做得更好,尽管在这种情况下这两个几乎等价。我认为从技术上讲,这是按预期工作的;但为了我们的JS用户,我们可以在这里做得更好。

yks3o0rb

yks3o0rb2#

这是一个例子:

type Currency = {
  unit: 'EUR' | 'GBP' | 'JPY' | 'USD'
  value: number
}

let Currency = { // TypeError 1
  DEFAULT: 'USD',
  from(value: number, unit = Currency.DEFAULT): Currency { // TypeError 2
    return {unit, value}
  }
}

如果这个类型检查通过就好了,因为当你运行它时,它按预期工作。要改进这需要很多工作吗?

1szpjjfi

1szpjjfi3#

@weswigham This looks fixed to me with TS 3.7.5. Can you please confirm

fgw7neuy

fgw7neuy4#

我仍然在操场上看到OP中描述的行为,甚至在3.8beta版本上。

3duebb1j

3duebb1j5#

是的,我发誓这个代码之前是可以正常运行的,但现在当我再次测试时,它又回到了any。是否有任何jsconfig设置会影响这个问题?

yzuktlbb

yzuktlbb6#

Errr.... `noImplicitAny` ?  `noImplicitThis` ?

相关问题