Change:
VS Code does not report errors in , and then silently drops the ball without telling the user. This is particularly annoying since some things might continue working, while others mysteriously stop. Errors in come in two flavours – actual syntactical errors, but also unrecognized new properties. In particular the latter is annoying, for example when TypeScript adds new features such as (see ). My suggestion would be to at least visibly and loudly report this, but preferably be more lenient about what's accepted (e.g. unrecognized properties).
FYI
+1 I had a similar issue (non existing compiler option) and I didn't get why my configured target=es6 got not accepted. Interestingly, it worked when compiling over command line but it failed when compiling over tsserver. See also the TS compiler code. Maybe one could get that error from tsserver back to VS code?
+1 I've just had a similar issue that I've spent 3 hours working through. Adding a new typescript 2 option such as "noUnusedParameters" caused vscode to reference not , making some of my code have errors in the editor, but not when built! I've worked around by having a different that I used for building with.
See

Discussion:
* ------------------------------------------------------------------------------------------ */ 'use strict'; <del> import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, DocumentFilter, Disposable } from 'vscode'; </del> <ins> import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, DocumentFilter, Disposable, Uri } from 'vscode'; </ins> // This must be the first statement otherwise modules might got loaded with // the wrong locale.

/* internal */ configFileDiagnosticsReceived(event: Proto.ConfigFileDiagnosticEvent): void { // See https://github.com/Microsoft/TypeScript/issues/10384 <del> /* https://github.com/Microsoft/TypeScript/issues/10473 </del> const body = event.body; <del> if (body.diagnostics) { const language = body.triggerFile ? this.findLanguage(body.triggerFile) : this.findLanguage(body.configFile); if (language) { if (body.diagnostics.length === 0) { language.configFileDiagnosticsReceived(body.configFile, []); } else if (body.diagnostics.length >= 1) { workspace.openTextDocument(Uri.file(body.configFile)).then((document) => { let curly: [number, number, number] = undefined; let nonCurly: [number, number, number] = undefined; let diagnostic: Diagnostic; for (let index = 0; index < document.lineCount; index++) { let line = document.lineAt(index); let text = line.text; let firstNonWhitespaceCharacterIndex = line.firstNonWhitespaceCharacterIndex; if (firstNonWhitespaceCharacterIndex < text.length) { if (text.charAt(firstNonWhitespaceCharacterIndex) === '{') { curly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + 1]; break; } else { let matches = /s*([^s]*)(?:s*|$)/.exec(text.substr(firstNonWhitespaceCharacterIndex)); if (matches.length >= 1) { nonCurly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + matches[1].length]; } } } } let match = curly || nonCurly; if (match) { diagnostic = new Diagnostic(new Range(match[0], match[1], match[0], match[2]), body.diagnostics[0].text); </del> <ins> if (!body || !body.diagnostics) { return; } const language = body.triggerFile ? this.findLanguage(body.triggerFile) : this.findLanguage(body.configFile); if (!language) { return; } if (body.diagnostics.length === 0) { language.configFileDiagnosticsReceived(body.configFile, []); } else if (body.diagnostics.length >= 1) { workspace.openTextDocument(Uri.file(body.configFile)).then((document) => { let curly: [number, number, number] | undefined = undefined; let nonCurly: [number, number, number] | undefined = undefined; let diagnostic: Diagnostic; for (let index = 0; index < document.lineCount; index++) { const line = document.lineAt(index); const text = line.text; const firstNonWhitespaceCharacterIndex = line.firstNonWhitespaceCharacterIndex; if (firstNonWhitespaceCharacterIndex < text.length) { if (text.charAt(firstNonWhitespaceCharacterIndex) === '{') { curly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + 1]; break; </ins> } else { <del> diagnostic = new Diagnostic(new Range(0,0,0,0), body.diagnostics[0].text); } if (diagnostic) { diagnostic.source = language.diagnosticSource; language.configFileDiagnosticsReceived(body.configFile, [diagnostic]); </del> <ins> const matches = /s*([^s]*)(?:s*|$)/.exec(text.substr(firstNonWhitespaceCharacterIndex)); if (matches && matches.length >= 1) { nonCurly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + matches[1].length]; } </ins> } <del> }, (error) => { language.configFileDiagnosticsReceived(body.configFile, [new Diagnostic(new Range(0,0,0,0), body.diagnostics[0].text)]); }); </del> <ins> } </ins> } <del> } </del> <ins> const match = curly || nonCurly; if (match) { diagnostic = new Diagnostic(new Range(match[0], match[1], match[0], match[2]), body.diagnostics[0].text); } else { diagnostic = new Diagnostic(new Range(0, 0, 0, 0), body.diagnostics[0].text); } if (diagnostic) { diagnostic.source = language.diagnosticSource; language.configFileDiagnosticsReceived(body.configFile, [diagnostic]); } }, (error) => { language.configFileDiagnosticsReceived(body.configFile, [new Diagnostic(new Range(0, 0, 0, 0), body.diagnostics[0].text)]); }); </ins> } <del> */ </del> } private createMarkerDatas(diagnostics: Proto.Diagnostic[], source: string): Diagnostic[] {