我可以强制使用Typescript来允许点符号

时间:2018-02-28 17:02:25

标签: angular typescript jasmine

我希望能够抑制从Typescript获取的编译时错误,我使用点符号来访问编译器不知道的属性。使用括号表示法的访问有效,但点表示法会产生编译错误。

我的具体情况是我使用Angular向Jasmine添加了一个自定义匹配器(称之为'toLookLike')。我可以用括号表示法来使用它:

expect(something)['toLookLike'](otherthing);

但使用点符号会更具可读性

expect(something).toLookLike(otherthing);

但是matcher是在运行时添加的,并且编译器不知道它,所以如果我使用点表示法,我会收到编译错误。

在这种情况下,有没有办法告诉Typescript点符号是否正常?我很乐意这样做一次,或者在使用该方法的每一行上。我当然不能将toLookLike添加到jasmine Matcher对象的定义中。

我非常熟悉允许对未定义属性使用通用点符号的问题,在这种特定情况下,我准备承担风险。我不需要解释为什么在一般情况下禁止点符号。我也读过并理解this question

3 个答案:

答案 0 :(得分:4)

如果您在运行时向类型化库添加内容并希望为其设置时间,则应考虑使用declaration merging,这会增加现有的内容并增加您自己的内容。

我不确定你是如何导入Jasmine的,但假设它是环境/全局的(如果你运行npm install --save-dev @types/jasmine就像你得到的那样),那么以下内容可能适合你:

declare global {
  namespace jasmine {
    interface Matchers<T> {
      // assuming that Expected<T> is the type of the param
      toLookLike(expected: Expected<T>): boolean;
    }
  }
}

然后你可以在设计时根据需要使用toLookLike()(只需确保你也进行运行时添加,或者它将编译正常然后在运行时中断)。

expect(something).toLookLike(otherthing); // okay now

希望有所帮助。祝你好运。

答案 1 :(得分:3)

我相信你正在使用jasmine,但如果没有,这也可以应用于其他库。你可以创建自己的打字。虽然另一个答案应该有效,但正如您所提到的,它并没有增加可读性。其他选项如下:

  1. 设置自定义输入looklike.matcher.d.ts

    declare module jasmine {
       interface Matchers {
          toLookLike(expected: any): boolean;
       } 
    }
    
  2. 将此打字参考添加到源代码中。只需在文件上方添加

    /// <reference path="./looklike.matcher.d.ts"/> 
    
  3. 然后你可以正常使用

    expect(something).toLookLike(otherthing);
    

答案 2 :(得分:2)

您可以简单地使用类型转换:

(expect(something) as any).toLookLike(otherthing);