【问题标题】:VSCode TypeScript does not highlight Function return type disagreementsVSCode TypeScript 不突出显示函数返回类型不一致
【发布时间】:2018-07-07 14:25:47
【问题描述】:

对 TypeScript 很陌生,并且一直专门在 VSCode 中编写它。 VSCode 为我突出显示类型“错误”,我非常依赖这些“错误”来发现我的错误。我不确定这是否是 TSLint 的一部分,或者它是什么或如何做到的。

然而,有一种“错误”,我发现它确实没有捕获。我希望我的类有一个属性,它是一个处理函数,可以在某个时候调用。一个不同的对象将传入此处理程序以供稍后调用。

我正在输入此属性以获得特定的调用签名和返回类型。如果我尝试将此属性设置为不同调用签名的函数,VSCode 会突出显示错误。但是,如果我尝试将此属性设置为具有错误 返回类型 的函数,它不会捕获它。

最好用一个最小的例子来演示:

class Student {
    private enroller : () => Course
    constructor(){
        this.enroller = function() { return(this); }
    }
}

class Course {
    public courseNumber : number;
    constructor(){

    }
}

现在,Student 的构造函数将 Student 的注册者属性设置为返回错误类型的函数。登记者应该是一个传回课程的函数。但是,我可以将其设置为传回自身(学生类)的函数。

有没有办法配置 TS/VSCode 来突出这种类型的错误?

老实说,不确定 TSLint 是什么,以及它是否在后台运行以突出显示这些语法错误,或者我是否必须将其作为单独的任务运行。

谢谢。

【问题讨论】:

    标签: typescript visual-studio-code tslint


    【解决方案1】:

    您遇到的问题是您在常规函数中使用 function 而不是箭头函数 (=>),除非另有说明,this 的类型为 any。因此,您正在定义一个返回 any 的函数,并将其分配给预期返回 Course 的函数。但是由于any 可以分配给任何东西,编译器允许这样做(例如var something: any; var c: Course = something; 是有效的)

    我不认为代码实际上具有您想要的行为。如果您想在当前对象中返回this,您应该使用箭头函数,这会导致错误(this.enroller = ()=> this;)。在您的代码中,因为没有人为您的匿名函数指定 this 是谁,所以它可能是窗口对象。

    为了保护自己免受此类错误的影响,您可以启用noImplicitThis 编译器标志,这不会像任何类型一样键入this,并且可以避免该问题。

    【讨论】:

    • 谢谢提香。你说的每一句话都有道理。我写了一个非常简单的例子来演示这个问题。在我的实际代码中,这些类的成员非常不同。我理解你所有的推理,但是这个例子: let cFn2 : ()=> Course = ()=> new Instructor();本质上是我抱怨的那个。编辑器并没有将其突出显示为错误,尽管它显然是一个错误。我将编辑我的问题以反映这些类具有不同的属性。
    • @mhermher 只是编辑器的问题吗?你有编译错误吗?
    • @mhermher 你也用什么版本的TS?我在 2.6 上,使用您的最新示例,错误在编辑器中突出显示。
    • 哇好。没关系。编辑后的版本确实会产生错误。我的实际代码版本在某种程度上实际上有所不同,但并未引发错误。感谢您的帮助,我需要找到一个更好的最小示例。
    • 就是这样!谢谢你。我没有意识到我做了什么!谢谢。将其更改为箭头函数会突出显示错误。现在我觉得自己很愚蠢,但谢谢。
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 2020-06-09
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多