【问题标题】:Can I force Typescript to allow dot notation [duplicate]我可以强制 Typescript 允许点符号吗?
【发布时间】:2023-03-03 09:37:02
【问题描述】:

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

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

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

但使用点符号会更易读

expect(something).toLookLike(otherthing);

但是匹配器是在运行时添加的,编译器不知道,所以如果我使用点符号会出现编译错误。

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

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

【问题讨论】:

    标签: angular typescript jasmine


    【解决方案1】:

    如果您在运行时将某些内容添加到类型库并希望在设计时为它键入,您应该考虑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
    

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

    【讨论】:

    • 这就是我要找的。副本也涵盖了它,但谢谢。
    【解决方案2】:

    我相信您正在使用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);
      

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 一个我没想到的好主意,谢谢。不过,它并没有大大增加可读性。
      • @DJClayworth 将any 用于不“任何”的东西绝不是一个好主意。
      • @estus 你说得对,它是一种特殊情况的解决方案,因为它不仅“丑化”了代码,而且还关闭了受影响表达式的类型检查。
      猜你喜欢
      • 2022-01-03
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多