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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以强制使用Typescript来允许点符号[重复]相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

expect(something).toLookLike(otherthing);

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

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

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

答案

如果您在运行时向类型化库添加内容并希望为其设计时间类型,则应考虑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

希望有所帮助。祝好运。

另一答案

我相信你正在使用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);
另一答案

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

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

以上是关于我可以强制使用Typescript来允许点符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在表达式引擎重定向循环上强制使用 HTTPS

UIView 实时强制重绘(绘图应用)

IO重定向和管道用法

在 VS Code 中强制使用多行 typescript 构造函数

Typescript:强制类来实现单例模式

打字稿:允许泛型类型仅是具有“字符串”属性的对象