VSCode TypeScript 不高亮函数 return 类型不一致

VSCode TypeScript does not highlight Function return type disagreements

对 TypeScript 很陌生,一直在 VSCode 中专门编写它。 VSCode 为我突出显示 "errors" 类型,我已经严重依赖它来发现我的错误。我不确定这是否是 TSLint 的一部分,或者它是做什么的或如何做的。

但是,有一种 "error",我发现它。我希望我的 class 有一个 属性,这是一个在某个时间调用的处理函数。一个不同的对象将传入此处理程序以供稍后调用。

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

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

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

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

    }
}

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

有没有配置 TS/VSCode 来突出显示此类错误?

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

谢谢。

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

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

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