【问题标题】:Show a warning when checking a function value instead of return value检查函数值而不是返回值时显示警告
【发布时间】:2019-09-20 16:20:12
【问题描述】:

当我尝试测试函数返回的值时,我经常被绊倒(通常是自动完成)。有时我忘记在它的末尾添加(),所以它总是返回true。

class Foo {
    public bar(): boolean {
        // return either true or false based on some logic
    }
}
let foo = new Foo();
if (foo.bar) {
    // UNINTENDED
    // always returns true due to "foo.bar" being a function object
}

if (foo.bar()) {
    // INTENDED
    // may return true or false depending on logic of "foo.bar"
}

在使用前者时有什么方法可以得到通知/警告?在调试时,并不总是会发现我错过了函数调用并且很难查明问题。或者,有没有更好的方法来编写代码来避免这个问题?

我正在使用 VS Code,因此我愿意接受任何可能有助于警告我这个问题的 linting。

【问题讨论】:

  • 您可以将bar 改为属性获取器..

标签: javascript typescript visual-studio-code


【解决方案1】:

如果bar 像属性获取器一样使用是有意义的,那么将其合二为一可能是有意义的。这样做可以为 Typescript 提供指出错误用法所需的信息。

找到一个可以做你想做的事情的 TSLint 标志可能会很尴尬。因为if (obj.someFunction) { 是完全有效的,并且在 Javascript 中使用了很多来测试函数调用。

成为房产并不难。

例如。

class test {
    get bar(): boolean {
        return true;
    }
}

var a = new test();

//This is OK.
if (a.bar) {}

//ERROR: Cannot invoke an expression whose type lacks a 
//call signature.
if (a.bar()) {}

【讨论】:

    【解决方案2】:

    我能想到几件事。首先,您可以尝试使用 linter。 TSLint 有一个名为strict-boolean-expressions 的选项,我认为它可以满足您的需求。其次,您可以将这样的方法制作成 getter。

    【讨论】:

    • 有没有办法将该 TSLint 规则仅应用于函数?
    • 根据docs看来不是这样的。
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多