[英]How to disable a ts rule for a specific line?
Summernote 是一个 jQuery 插件,我不需要它的类型定义。 我只想修改对象,但 TS 不断抛出错误。 下面的行仍然给我: “类型'jQueryStatic'上不存在属性'summernote'。” 错误。
(function ($) {
/* tslint:disable */
delete $.summernote.options.keyMap.pc.TAB;
delete $.summernote.options.keyMap.mac.TAB;
/* tslint:enable */
})(jQuery)
编辑:
这是我的 tsconfig.json
{
"compilerOptions": {
"outDir": "./dist/",
"sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es5",
"allowJs": true,
"noUnusedParameters": true
},
"include": [
"js/**/*"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}
从 Typescript 2.6 开始,您现在可以绕过特定行的编译器错误/警告:
if (false) {
// @ts-ignore: Unreachable code error
console.log("hello");
}
请注意, 官方文档“建议您非常谨慎地使用 [this]” 。 几乎总是首选转换为any
,因为这样可以更好地表达意图。
较旧的答案:
您可以使用/* tslint:disable-next-line */
在本地禁用 tslint。 但是,由于这是一个编译器错误,因此禁用 tslint 可能无济于事。
您可以随时将$
临时转换为any
:
delete ($ as any).summernote.options.keyMap.pc.TAB
这将允许您访问所需的任何属性。
@ts-expect-error
TypeScript 3.9引入了一个新的魔术注释。 @ts-expect-error
将:
@ts-ignore
相同的功能if (false) {
// @ts-expect-error: Let's ignore a compile error like this unreachable code
console.log("hello"); // compiles
}
// If @ts-expect-error didn't suppress anything at all, we now get a nice warning
let flag = true;
// ...
if (flag) {
// @ts-expect-error
// ^~~~~~~~~~~~~~~^ error: "Unused '@ts-expect-error' directive.(2578)"
console.log("hello");
}
@ts-ignore
和@ts-expect-error
就像是编译错误的大锤。 对于大多数情况,TypeScript 开发人员建议使用更细粒度、范围更窄的类型系统解决方案:
我们添加 ts-ignore 的目的是为了将其用于任何现有类型系统机制无法抑制的剩余 5% [...] 在您的代码库中应该有非常非常少
ts-ignore
[。 ] - 微软/TypeScript#19139
[...] 从根本上说,我们认为您根本不应该在 TypeScript 中使用抑制。 如果这是一个类型问题,您可以排除它(这就是为什么存在
any
、 转换和速记模块声明的原因)。 如果这是一个语法问题,那么一切都很糟糕,无论如何我们都会被打破,所以抑制不会做任何事情(抑制不会影响解析错误)。 - 微软/TypeScript#19573
▶ 使用any
类型
// type assertion for single expression
delete ($ as any).summernote.options.keyMap.pc.TAB;
// new variable assignment for multiple usages
const $$: any = $
delete $$.summernote.options.keyMap.pc.TAB;
delete $$.summernote.options.keyMap.mac.TAB;
▶ JQueryStatic
接口
// ./global.d.ts
interface JQueryStatic {
summernote: any;
}
// ./main.ts
delete $.summernote.options.keyMap.pc.TAB; // works
在其他情况下, 速记声明/ 扩充是编译没有/可扩展类型的模块的方便实用程序。 一个可行的策略也是增量迁移到 TypeScript,通过allowJs
和checkJs: false
编译器标志将尚未迁移的代码保留在.js
中。
您可以在该行之前简单地使用以下内容: // @ts-ignore
如果您使用eslint
执行检查或修复,您可以通过在该行顶部添加此行来禁用该行
// eslint-disable-next-line @typescript-eslint/<RELEVANT_ESLINT_RULE>
我在错误之前使用了// @ts-ignore:next-line
。
与此答案类似,您可以覆盖JQueryStatic
类型定义以包含summernote
属性。
interface JQueryStatic {
// Opt out of type-checking summernote using the any type
// See https://www.typescriptlang.org/docs/handbook/basic-types.html#any
summernote: any
}
(function ($) {
delete $.summernote.options.keyMap.pc.TAB;
delete $.summernote.options.keyMap.mac.TAB;
})(jQuery)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.