18

我想知道是否有办法在编译时忽略某些 TypeScript 错误?

我基本上遇到了大多数大型项目的人在使用this关键字时遇到的相同问题,我不想将所有类方法都放入构造函数中。

所以我有一个这样的例子:

打字稿示例

这似乎创建了完全有效的 JS 并允许我绕过this关键字问题,但是正如您在示例中看到的那样,打字稿编译器告诉我,我无法将该代码编译为关键字 this 在该范围内无效。但是我不明白为什么它是一个错误,因为它产生了好的代码。

那么有没有办法告诉它忽略某些错误?我相信只要有时间,就会有一种很好的方法来管理this关键字,但目前我觉得它非常可怕。

== 编辑 ==

(除非你关心这个问题的上下文和部分咆哮,否则不要阅读)

只是为这一切添加一些背景信息,以表明我不仅仅是一些疯狂的工作(我相信你们中的很多人仍然认为我是)并且我有一些很好的理由让我能够允许这些要经历的错误。

以下是我之前提出的一些问题,这些问题突出了 TypeScript当前 实现的一些主要问题(imo)。

使用带有 Typescript 的草坪椅

Typescript 中 this 的子范围问题

https://typescript.codeplex.com/discussions/429350(我在底部做了一些评论)

我遇到的根本问题是我需要保证所有逻辑都在一致的范围内,我需要能够访问淘汰赛、jQuery 等和类的本地实例中的东西。我曾经使用 JavaScript 中的类内声明来执行此操作,var self = this;并且效果很好。正如之前的一些问题中提到的,我现在不能这样做,所以我可以保证范围的唯一方法是使用 lambda 方法,而我可以将其中一个定义为类中的方法的唯一方法是在构造函数中,这部分很大程度上取决于个人喜好,但我发现人们似乎认为使用该语法被归类为推荐模式而不仅仅是一种解决方法,这很可怕。

我知道 TypeScript 处于 alpha 阶段,很多事情都会发生变化,我非常希望我们能找到更好的方法来处理这个问题,但目前我要么把一切都弄得一团糟,只是为了让 typescript 工作(这是在数百个文件中)我正在迁移到 TypeScript )或者我只是在这种情况下进行比编译器更了解的调用(我知道非常危险)所以我可以保持我的代码很好,并希望当出现更好的模式来处理这个问题时我然后可以迁移它。

顺便说一句,我知道很多人都喜欢 TypeScript 正在接受并尝试尽可能接近新的 JavaScript 功能和已知语法的事实,这很棒,但 typescript 不是 JavaScript 的下一个版本,所以我认为在语言中添加一些语法糖没有问题,因为想要使用最新最好的官方 JavaScript 实现的人仍然可以这样做。

4

3 回答 3

22

作者的具体问题this似乎已经解决,但问题是关于忽略错误,对于那些最终在这里寻找如何忽略错误的人:

如果从 TypeScript 2.6(2017 年 10 月 31 日发布)开始,无法正确修复错误或使用此处已经建议的更体面的解决方法,现在有一种方法可以使用目标之前的注释忽略特定行中的所有错误// @ts-ignore线。

修改过的文档足够简洁,但要回顾一下:

// @ts-ignore
const s : string = false

禁用此行的错误报告。

(x as any)但是,只有在修复错误或使用 hack比丢失所有类型检查更麻烦时,才应将其用作最后的手段。

至于指定某些错误,这里讨论了当前(2018 年中)状态,在 Design Meeting Notes (2/16/2018) 和进一步评论中,基本上是

“还没有定论”

并强烈反对引入这种微调。

于 2018-08-11T06:49:34.577 回答
4

我认为您提出的问题是XY 问题。您的目标是如何确保我的某些类方法保证具有正确的this上下文?

对于这个问题,我会提出这个解决方案:

class LambdaMethods {
    constructor(private message: string) {
        this.DoSomething = this.DoSomething.bind(this);
    }

    public DoSomething() {
        alert(this.message);
    }
}

这有几个好处。

首先,您要明确说明正在发生的事情。大多数程序员可能不会理解关于代码生成方面成员和方法语法之间差异的微妙语义。

其次,通过查看构造函数,它非常清楚哪些方法将具有保证的this上下文。至关重要的是,从性能角度来看,您不想以这种方式编写所有方法,而只是那些绝对需要它的方法。

最后,它保留了类的 OOP 语义。您实际上可以super.DoSomethingDoSomething.

于 2013-04-15T19:20:00.633 回答
2

我相信您知道定义没有箭头符号的函数的标准形式。还有另一个 TypeScript 表达式可以生成完全相同的代码,但没有编译错误:

class LambdaMethods {
    private message: string;
    public DoSomething: () => void;

    constructor(message: string) {
        this.message = message;
        this.DoSomething = () => { alert(this.message); };
    }
}

那么为什么这个是合法的而另一个不是呢?好吧,根据规范:an arrow function expression preserves the this of its enclosing context。所以它保留了this它声明的范围的含义。但是在类级别声明一个函数this实际上并没有任何意义。

这是一个错误的示例,原因完全相同,可能更清楚:

class LambdaMethods {
    private message: string;

    constructor(message: string) {
        this.message = message;
    }

    var a = this.message;  // can't do this
}

初始化器与构造器结合的工作方式是一个不能依赖的实现细节。它可能会改变。

我相信只要有时间,就会有一种很好的方法来管理 this 关键字,但目前我觉得它非常可怕。

TypeScript 的高级目标之一(我喜欢)是扩展 JavaScript 语言并使用它,而不是与之抗争。如何this操作很棘手,但值得学习。

于 2013-04-15T16:51:57.630 回答