我可以强制使用Typescript来允许点符号[重复]

问题描述 投票:1回答:3

这个问题在这里已有答案:

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

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

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

但使用点表示法会更具可读性

expect(something).toLookLike(otherthing);

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

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

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

angular typescript jasmine
3个回答
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

希望有所帮助。祝好运。


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
投票

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

(expect(something) as any).toLookLike(otherthing);
© www.soinside.com 2019 - 2024. All rights reserved.