如何禁用特定行的 ts 规则?
Posted
技术标签:
【中文标题】如何禁用特定行的 ts 规则?【英文标题】:How to disable a ts rule for a specific line? 【发布时间】:2017-09-22 22:51:26 【问题描述】:Summernote 是一个 jQuery 插件,我不需要为它定义类型。我只想修改对象,但 TS 不断抛出错误。下面这行仍然给我:“属性 'summernote' 不存在于类型 'jQueryStatic'。” 错误。
(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"
]
【问题讨论】:
【参考方案1】:从 Typescript 2.6 开始,您现在可以绕过特定行的编译器错误/警告:
if (false)
// @ts-ignore: Unreachable code error
console.log("hello");
请注意the official docs "recommend you use [this] very sparingly"。几乎总是最好改为any
,因为这样可以更好地表达意图。
旧答案:
您可以使用/* tslint:disable-next-line */
在本地禁用 tslint。但是,由于这是一个编译器错误,因此禁用 tslint 可能无济于事。
您可以随时将$
临时转换为any
:
delete ($ as any).summernote.options.keyMap.pc.TAB
这将允许您访问所需的任何属性。
【讨论】:
接受的答案不回答一般问题。禁用规则。 有 an active issue 与@ts-ignore
相关的特定错误。
以及如何在 jsx 中禁用 line?
@Atombit 这是一个 GH 问题的解决方案:github.com/Microsoft/TypeScript/issues/27552
@ts-ignore
不是推荐的解决方案,而是使用建议的@ts-expect-error
【参考方案2】:
@ts-expect-error
TypeScript 3.9 引入了一个新的魔法评论。 @ts-expect-error
将:
@ts-ignore
相同的功能
触发错误,如果实际上no编译器错误已被抑制(= 表示无用标志)
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");
Playground
TypeScript 开发人员有什么建议?
@ts-ignore
和 @ts-expect-error
就像是编译错误的大锤。对于大多数情况,TypeScript 开发人员建议使用更细粒度、范围更窄的类型系统解决方案:
我们添加 ts-ignore 的目的是为了将其用于任何现有类型系统机制无法抑制的剩余 5% [...] 在您的代码库[.] - microsoft/TypeScript#19139
[...] 从根本上说,我们认为您根本不应该在 TypeScript 中使用抑制。如果是类型问题,您可以排除它(这就是存在
any
、转换和速记模块声明的原因)。如果这是一个语法问题,那么一切都很糟糕,无论如何我们都会被打破,所以抑制不会做任何事情(抑制不会影响解析错误)。 - microsoft/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;
▶AugmentJQueryStatic
接口
// ./global.d.ts
interface JQueryStatic
summernote: any;
// ./main.ts
delete $.summernote.options.keyMap.pc.TAB; // works
在其他情况下,shorthand declarations / augmentations 是用于编译没有/可扩展类型的模块的便捷实用程序。一个可行的策略也是 incrementally migrate 到 TypeScript,keeping not yet migrated code in .js
通过 allowJs
和 checkJs: false
编译器标志。
【讨论】:
【参考方案3】:您可以在该行之前简单地使用以下内容:
// @ts-ignore
【讨论】:
有时你可能想禁用 eslint// eslint-disable-next-line @typescript-eslint/ban-ts-comment
【参考方案4】:
如果您使用eslint
来执行检查或修复,您可以通过将其添加到该行的顶部来禁用该行
// eslint-disable-next-line @typescript-eslint/<RELEVANT_ESLINT_RULE>
【讨论】:
以上是关于如何禁用特定行的 ts 规则?的主要内容,如果未能解决你的问题,请参考以下文章