我希望能够抑制从Typescript获取的编译时错误,我使用点符号来访问编译器不知道的属性。使用括号表示法的访问有效,但点表示法会产生编译错误。
我的具体情况是我使用Angular向Jasmine添加了一个自定义匹配器(称之为'toLookLike')。我可以用括号表示法来使用它:
expect(something)['toLookLike'](otherthing);
但使用点符号会更具可读性
expect(something).toLookLike(otherthing);
但是matcher是在运行时添加的,并且编译器不知道它,所以如果我使用点表示法,我会收到编译错误。
在这种情况下,有没有办法告诉Typescript点符号是否正常?我很乐意这样做一次,或者在使用该方法的每一行上。我当然不能将toLookLike添加到jasmine Matcher对象的定义中。
我非常熟悉允许对未定义属性使用通用点符号的问题,在这种特定情况下,我准备承担风险。我不需要解释为什么在一般情况下禁止点符号。我也读过并理解this question。
答案 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
,但如果没有,这也可以应用于其他库。你可以创建自己的打字。虽然另一个答案应该有效,但正如您所提到的,它并没有增加可读性。其他选项如下:
设置自定义输入looklike.matcher.d.ts
declare module jasmine {
interface Matchers {
toLookLike(expected: any): boolean;
}
}
将此打字参考添加到源代码中。只需在文件上方添加
/// <reference path="./looklike.matcher.d.ts"/>
然后你可以正常使用
expect(something).toLookLike(otherthing);
答案 2 :(得分:2)
您可以简单地使用类型转换:
(expect(something) as any).toLookLike(otherthing);