Disable evolving types with implicit any

That is, without --noImplicitAny
This commit is contained in:
Nathan Shively-Sanders 2016-11-18 13:51:44 -08:00
parent 9fec77551c
commit 8674d92bdb
5 changed files with 4 additions and 947 deletions

View file

@ -3238,9 +3238,11 @@ namespace ts {
return addOptionality(getTypeFromTypeNode(declaration.type), /*optional*/ declaration.questionToken && includeOptionality);
}
if (declaration.kind === SyntaxKind.VariableDeclaration && !isBindingPattern(declaration.name) &&
if (compilerOptions.noImplicitAny &&
declaration.kind === SyntaxKind.VariableDeclaration && !isBindingPattern(declaration.name) &&
!(getCombinedModifierFlags(declaration) & ModifierFlags.Export) && !isInAmbientContext(declaration)) {
// Use control flow tracked 'any' type for non-ambient, non-exported var or let variables with no
// If --noImplicitAny is on,
// use control flow tracked 'any' type for non-ambient, non-exported var or let variables with no
// initializer or a 'null' or 'undefined' initializer.
if (!(getCombinedNodeFlags(declaration) & NodeFlags.Const) && (!declaration.initializer || isNullOrUndefined(declaration.initializer))) {
return autoType;

View file

@ -1,247 +0,0 @@
//// [controlFlowLetVar.ts]
declare let cond: boolean;
// CFA for 'let' with no type annotation and initializer
function f1() {
let x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'let' with no type annotation and 'undefined' initializer
function f2() {
let x = undefined;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'let' with no type annotation and 'null' initializer
function f3() {
let x = null;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | null
}
// No CFA for 'let' with with type annotation
function f4() {
let x: any;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // any
}
// CFA for 'var' with no type annotation and initializer
function f5() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'var' with no type annotation and 'undefined' initializer
function f6() {
var x = undefined;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'var' with no type annotation and 'null' initializer
function f7() {
var x = null;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | null
}
// No CFA for 'var' with with type annotation
function f8() {
var x: any;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // any
}
// No CFA for captured outer variables
function f9() {
let x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
function f() {
const z = x; // any
}
}
// No CFA for captured outer variables
function f10() {
let x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
const f = () => {
const z = x; // any
};
}
//// [controlFlowLetVar.js]
// CFA for 'let' with no type annotation and initializer
function f1() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | undefined
}
// CFA for 'let' with no type annotation and 'undefined' initializer
function f2() {
var x = undefined;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | undefined
}
// CFA for 'let' with no type annotation and 'null' initializer
function f3() {
var x = null;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | null
}
// No CFA for 'let' with with type annotation
function f4() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // any
}
// CFA for 'var' with no type annotation and initializer
function f5() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | undefined
}
// CFA for 'var' with no type annotation and 'undefined' initializer
function f6() {
var x = undefined;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | undefined
}
// CFA for 'var' with no type annotation and 'null' initializer
function f7() {
var x = null;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | null
}
// No CFA for 'var' with with type annotation
function f8() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // any
}
// No CFA for captured outer variables
function f9() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | undefined
function f() {
var z = x; // any
}
}
// No CFA for captured outer variables
function f10() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
var y = x; // string | number | undefined
var f = function () {
var z = x; // any
};
}

View file

@ -1,263 +0,0 @@
=== tests/cases/compiler/controlFlowLetVar.ts ===
declare let cond: boolean;
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
// CFA for 'let' with no type annotation and initializer
function f1() {
>f1 : Symbol(f1, Decl(controlFlowLetVar.ts, 1, 26))
let x;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 5, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 5, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 5, 7))
}
const y = x; // string | number | undefined
>y : Symbol(y, Decl(controlFlowLetVar.ts, 12, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 5, 7))
}
// CFA for 'let' with no type annotation and 'undefined' initializer
function f2() {
>f2 : Symbol(f2, Decl(controlFlowLetVar.ts, 13, 1))
let x = undefined;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 17, 7))
>undefined : Symbol(undefined)
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 17, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 17, 7))
}
const y = x; // string | number | undefined
>y : Symbol(y, Decl(controlFlowLetVar.ts, 24, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 17, 7))
}
// CFA for 'let' with no type annotation and 'null' initializer
function f3() {
>f3 : Symbol(f3, Decl(controlFlowLetVar.ts, 25, 1))
let x = null;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 29, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 29, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 29, 7))
}
const y = x; // string | number | null
>y : Symbol(y, Decl(controlFlowLetVar.ts, 36, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 29, 7))
}
// No CFA for 'let' with with type annotation
function f4() {
>f4 : Symbol(f4, Decl(controlFlowLetVar.ts, 37, 1))
let x: any;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 41, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 41, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 41, 7))
}
const y = x; // any
>y : Symbol(y, Decl(controlFlowLetVar.ts, 48, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 41, 7))
}
// CFA for 'var' with no type annotation and initializer
function f5() {
>f5 : Symbol(f5, Decl(controlFlowLetVar.ts, 49, 1))
var x;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 53, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 53, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 53, 7))
}
const y = x; // string | number | undefined
>y : Symbol(y, Decl(controlFlowLetVar.ts, 60, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 53, 7))
}
// CFA for 'var' with no type annotation and 'undefined' initializer
function f6() {
>f6 : Symbol(f6, Decl(controlFlowLetVar.ts, 61, 1))
var x = undefined;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 65, 7))
>undefined : Symbol(undefined)
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 65, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 65, 7))
}
const y = x; // string | number | undefined
>y : Symbol(y, Decl(controlFlowLetVar.ts, 72, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 65, 7))
}
// CFA for 'var' with no type annotation and 'null' initializer
function f7() {
>f7 : Symbol(f7, Decl(controlFlowLetVar.ts, 73, 1))
var x = null;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 77, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 77, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 77, 7))
}
const y = x; // string | number | null
>y : Symbol(y, Decl(controlFlowLetVar.ts, 84, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 77, 7))
}
// No CFA for 'var' with with type annotation
function f8() {
>f8 : Symbol(f8, Decl(controlFlowLetVar.ts, 85, 1))
var x: any;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 89, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 89, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 89, 7))
}
const y = x; // any
>y : Symbol(y, Decl(controlFlowLetVar.ts, 96, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 89, 7))
}
// No CFA for captured outer variables
function f9() {
>f9 : Symbol(f9, Decl(controlFlowLetVar.ts, 97, 1))
let x;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 101, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 101, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 101, 7))
}
const y = x; // string | number | undefined
>y : Symbol(y, Decl(controlFlowLetVar.ts, 108, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 101, 7))
function f() {
>f : Symbol(f, Decl(controlFlowLetVar.ts, 108, 16))
const z = x; // any
>z : Symbol(z, Decl(controlFlowLetVar.ts, 110, 13))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 101, 7))
}
}
// No CFA for captured outer variables
function f10() {
>f10 : Symbol(f10, Decl(controlFlowLetVar.ts, 112, 1))
let x;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 116, 7))
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = 1;
>x : Symbol(x, Decl(controlFlowLetVar.ts, 116, 7))
}
if (cond) {
>cond : Symbol(cond, Decl(controlFlowLetVar.ts, 1, 11))
x = "hello";
>x : Symbol(x, Decl(controlFlowLetVar.ts, 116, 7))
}
const y = x; // string | number | undefined
>y : Symbol(y, Decl(controlFlowLetVar.ts, 123, 9))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 116, 7))
const f = () => {
>f : Symbol(f, Decl(controlFlowLetVar.ts, 124, 9))
const z = x; // any
>z : Symbol(z, Decl(controlFlowLetVar.ts, 125, 13))
>x : Symbol(x, Decl(controlFlowLetVar.ts, 116, 7))
};
}

View file

@ -1,306 +0,0 @@
=== tests/cases/compiler/controlFlowLetVar.ts ===
declare let cond: boolean;
>cond : boolean
// CFA for 'let' with no type annotation and initializer
function f1() {
>f1 : () => void
let x;
>x : any
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | undefined
>y : string | number | undefined
>x : string | number | undefined
}
// CFA for 'let' with no type annotation and 'undefined' initializer
function f2() {
>f2 : () => void
let x = undefined;
>x : any
>undefined : undefined
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | undefined
>y : string | number | undefined
>x : string | number | undefined
}
// CFA for 'let' with no type annotation and 'null' initializer
function f3() {
>f3 : () => void
let x = null;
>x : any
>null : null
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | null
>y : string | number | null
>x : string | number | null
}
// No CFA for 'let' with with type annotation
function f4() {
>f4 : () => void
let x: any;
>x : any
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // any
>y : any
>x : any
}
// CFA for 'var' with no type annotation and initializer
function f5() {
>f5 : () => void
var x;
>x : any
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | undefined
>y : string | number | undefined
>x : string | number | undefined
}
// CFA for 'var' with no type annotation and 'undefined' initializer
function f6() {
>f6 : () => void
var x = undefined;
>x : any
>undefined : undefined
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | undefined
>y : string | number | undefined
>x : string | number | undefined
}
// CFA for 'var' with no type annotation and 'null' initializer
function f7() {
>f7 : () => void
var x = null;
>x : any
>null : null
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | null
>y : string | number | null
>x : string | number | null
}
// No CFA for 'var' with with type annotation
function f8() {
>f8 : () => void
var x: any;
>x : any
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // any
>y : any
>x : any
}
// No CFA for captured outer variables
function f9() {
>f9 : () => void
let x;
>x : any
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | undefined
>y : string | number | undefined
>x : string | number | undefined
function f() {
>f : () => void
const z = x; // any
>z : any
>x : any
}
}
// No CFA for captured outer variables
function f10() {
>f10 : () => void
let x;
>x : any
if (cond) {
>cond : boolean
x = 1;
>x = 1 : 1
>x : any
>1 : 1
}
if (cond) {
>cond : boolean
x = "hello";
>x = "hello" : "hello"
>x : any
>"hello" : "hello"
}
const y = x; // string | number | undefined
>y : string | number | undefined
>x : string | number | undefined
const f = () => {
>f : () => void
>() => { const z = x; // any } : () => void
const z = x; // any
>z : any
>x : any
};
}

View file

@ -1,129 +0,0 @@
// @strictNullChecks: true
declare let cond: boolean;
// CFA for 'let' with no type annotation and initializer
function f1() {
let x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'let' with no type annotation and 'undefined' initializer
function f2() {
let x = undefined;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'let' with no type annotation and 'null' initializer
function f3() {
let x = null;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | null
}
// No CFA for 'let' with with type annotation
function f4() {
let x: any;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // any
}
// CFA for 'var' with no type annotation and initializer
function f5() {
var x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'var' with no type annotation and 'undefined' initializer
function f6() {
var x = undefined;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
}
// CFA for 'var' with no type annotation and 'null' initializer
function f7() {
var x = null;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | null
}
// No CFA for 'var' with with type annotation
function f8() {
var x: any;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // any
}
// No CFA for captured outer variables
function f9() {
let x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
function f() {
const z = x; // any
}
}
// No CFA for captured outer variables
function f10() {
let x;
if (cond) {
x = 1;
}
if (cond) {
x = "hello";
}
const y = x; // string | number | undefined
const f = () => {
const z = x; // any
};
}