VSCode TypeScript不突出显示函数返回类型不一致

时间:2018-01-28 22:23:02

标签: typescript visual-studio-code tslint

对TypeScript来说很新,并且一直在VSCode中编写它。 VSCode为我突出显示类型“错误”,我已经大量依赖它来捕捉我的错误。我不确定这是否是TSLint的一部分或它是做什么或如何做的。

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

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

最好用最小的例子来证明:

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

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

    }
}

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

是否有配置TS / VSCode突出显示此类错误?

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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