Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Respect //@ts-nocheck in TS files #33383

Merged
merged 1 commit into from Sep 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/compiler/program.ts
Expand Up @@ -1691,9 +1691,10 @@ namespace ts {
Debug.assert(!!sourceFile.bindDiagnostics);

const isCheckJs = isCheckJsEnabledForFile(sourceFile, options);
const isTsNoCheck = !!sourceFile.checkJsDirective && sourceFile.checkJsDirective.enabled === false;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question, currently unchecked files have also some fuzzy completions (currently only in js files since those are the only ones) but would we want that? I think no but I am just pointing out one of the checkJs enabled and disabled difference.

Similarly there is disableJsDiagnostics code fix, do we need similar one now for ts?

Handle report reportImplicitAny for early exit?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think a //@ts-nocheck in a TS file should do anything other than suppress errors - everything else should be as-is.

// By default, only type-check .ts, .tsx, 'Deferred' and 'External' files (external files are added by plugins)
const includeBindAndCheckDiagnostics = sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX ||
sourceFile.scriptKind === ScriptKind.External || isCheckJs || sourceFile.scriptKind === ScriptKind.Deferred;
const includeBindAndCheckDiagnostics = !isTsNoCheck && (sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX ||
sourceFile.scriptKind === ScriptKind.External || isCheckJs || sourceFile.scriptKind === ScriptKind.Deferred);
const bindDiagnostics: readonly Diagnostic[] = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray;
const checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray;
const fileProcessingDiagnosticsInFile = fileProcessingDiagnostics.getDiagnostics(sourceFile.fileName);
Expand Down
57 changes: 57 additions & 0 deletions tests/baselines/reference/tsNoCheckForTypescript.js
@@ -0,0 +1,57 @@
//// [file.ts]
// @ts-nocheck

export const a = 1 + {}; // This is an error, ofc, `Operator '+' cannot be applied to types '1' and '{}'`, which will be suppressed by the `nocheck` comment

export interface Aleph {
q: number;
}

export class Bet implements Aleph {
q: string = "lol" // And so will this implements error
}


//// [file.js]
"use strict";
// @ts-nocheck
exports.__esModule = true;
exports.a = 1 + {}; // This is an error, ofc, `Operator '+' cannot be applied to types '1' and '{}'`, which will be suppressed by the `nocheck` comment
var Bet = /** @class */ (function () {
function Bet() {
this.q = "lol"; // And so will this implements error
}
return Bet;
}());
exports.Bet = Bet;


//// [file.d.ts]
export declare const a: any;
export interface Aleph {
q: number;
}
export declare class Bet implements Aleph {
q: string;
}


//// [DtsFileErrors]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just decided to have declaration emit on to capture the true "garbage in, garbage out" aspect of error suppression. Again, this was already doable with multiple individual //@ts-ignores so....



tests/cases/conformance/jsdoc/file.d.ts(6,5): error TS2416: Property 'q' in type 'Bet' is not assignable to the same property in base type 'Aleph'.
Type 'string' is not assignable to type 'number'.


==== tests/cases/conformance/jsdoc/file.d.ts (1 errors) ====
export declare const a: any;
export interface Aleph {
q: number;
}
export declare class Bet implements Aleph {
q: string;
~
!!! error TS2416: Property 'q' in type 'Bet' is not assignable to the same property in base type 'Aleph'.
!!! error TS2416: Type 'string' is not assignable to type 'number'.
}

21 changes: 21 additions & 0 deletions tests/baselines/reference/tsNoCheckForTypescript.symbols
@@ -0,0 +1,21 @@
=== tests/cases/conformance/jsdoc/file.ts ===
// @ts-nocheck

export const a = 1 + {}; // This is an error, ofc, `Operator '+' cannot be applied to types '1' and '{}'`, which will be suppressed by the `nocheck` comment
>a : Symbol(a, Decl(file.ts, 2, 12))

export interface Aleph {
>Aleph : Symbol(Aleph, Decl(file.ts, 2, 24))

q: number;
>q : Symbol(Aleph.q, Decl(file.ts, 4, 24))
}

export class Bet implements Aleph {
>Bet : Symbol(Bet, Decl(file.ts, 6, 1))
>Aleph : Symbol(Aleph, Decl(file.ts, 2, 24))

q: string = "lol" // And so will this implements error
>q : Symbol(Bet.q, Decl(file.ts, 8, 35))
}

22 changes: 22 additions & 0 deletions tests/baselines/reference/tsNoCheckForTypescript.types
@@ -0,0 +1,22 @@
=== tests/cases/conformance/jsdoc/file.ts ===
// @ts-nocheck

export const a = 1 + {}; // This is an error, ofc, `Operator '+' cannot be applied to types '1' and '{}'`, which will be suppressed by the `nocheck` comment
>a : any
>1 + {} : any
>1 : 1
>{} : {}

export interface Aleph {
q: number;
>q : number
}

export class Bet implements Aleph {
>Bet : Bet

q: string = "lol" // And so will this implements error
>q : string
>"lol" : "lol"
}

14 changes: 14 additions & 0 deletions tests/cases/conformance/jsdoc/tsNoCheckForTypescript.ts
@@ -0,0 +1,14 @@
// @declaration: true
// @filename: file.ts

// @ts-nocheck

export const a = 1 + {}; // This is an error, ofc, `Operator '+' cannot be applied to types '1' and '{}'`, which will be suppressed by the `nocheck` comment

export interface Aleph {
q: number;
}

export class Bet implements Aleph {
q: string = "lol" // And so will this implements error
}