我可以强制使用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
,但如果没有,这也可以应用于其他库。你可以创建自己的打字。虽然另一个答案应该有效,但正如您所提到的,它并没有增加可读性。其他选项如下:
- 设置自定义输入
looklike.matcher.d.ts
declare module jasmine { interface Matchers { toLookLike(expected: any): boolean; } }
- 将此打字参考添加到源代码中。只需在文件上方添加
/// <reference path="./looklike.matcher.d.ts"/>
- 然后你可以正常使用它
expect(something).toLookLike(otherthing);
你可以简单地使用类型转换:
(expect(something) as any).toLookLike(otherthing);
以上是关于我可以强制使用Typescript来允许点符号[重复]的主要内容,如果未能解决你的问题,请参考以下文章