function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
            var type = getTypeForVariableLikeDeclaration(declaration);
            if (type) {
                if (reportErrors) {
                    reportErrorsFromWidening(declaration, type);
                }
                // During a normal type check we'll never get to here with a property assignment (the check of the containing
                // object literal uses a different path). We exclude widening only so that language services and type verification
                // tools see the actual type.
                return declaration.kind !== 245 /* PropertyAssignment */ ? getWidenedType(type) : type;
            }
            // Rest parameters default to type any[], other parameters default to type any
            type = declaration.dotDotDotToken ? anyArrayType : anyType;
            // Report implicit any errors unless this is a private property within an ambient declaration
            if (reportErrors && compilerOptions.noImplicitAny) {
                var root = ts.getRootDeclaration(declaration);
                if (!isPrivateWithinAmbient(root) && !(root.kind === 138 /* Parameter */ && isPrivateWithinAmbient(root.parent))) {
                    reportImplicitAnyError(declaration, type);
                }
            }
            return type;
        }
function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
            var type = getTypeForVariableLikeDeclaration(declaration);
            if (type) {
                if (reportErrors) {
                    reportErrorsFromWidening(declaration, type);
                }
                
                
                
                return declaration.kind !== 245  ? getWidenedType(type) : type;
            }
            
            type = declaration.dotDotDotToken ? anyArrayType : anyType;
            
            if (reportErrors && compilerOptions.noImplicitAny) {
                var root = ts.getRootDeclaration(declaration);
                if (!isPrivateWithinAmbient(root) && !(root.kind === 138  && isPrivateWithinAmbient(root.parent))) {
                    reportImplicitAnyError(declaration, type);
                }
            }
            return type;
        }
function getWidenedTypeForVariableLikeDeclaration ( declaration , reportErrors ) { var type = getTypeForVariableLikeDeclaration ( declaration ) ; if ( type ) { if ( reportErrors ) { reportErrorsFromWidening ( declaration , type ) ; } // During a normal type check we'll never get to here with a property assignment (the check of the containing // object literal uses a different path). We exclude widening only so that language services and type verification // tools see the actual type. return declaration . kind !== 245 /* PropertyAssignment */ ? getWidenedType ( type ) : type ; } // Rest parameters default to type any[], other parameters default to type any type = declaration . dotDotDotToken ? anyArrayType : anyType ; // Report implicit any errors unless this is a private property within an ambient declaration if ( reportErrors && compilerOptions . noImplicitAny ) { var root = ts . getRootDeclaration ( declaration ) ; if ( ! isPrivateWithinAmbient ( root ) && ! ( root . kind === 138 /* Parameter */ && isPrivateWithinAmbient ( root . parent ) ) ) { reportImplicitAnyError ( declaration , type ) ; } } return type ; }
Return the type associated with a variable, parameter, or property declaration. In the simple case this is the type specified in a type annotation or inferred from an initializer. However, in the case of a destructuring declaration it is a bit more involved. For example:  var [x, s = ""] = [1, "one"];  Here, the array literal [1, "one"] is contextually typed by the type [any, string], which is the implied type of the binding pattern [x, s = ""]. Because the contextual type is a tuple type, the resulting type of [1, "one"] is the tuple type [number, string]. Thus, the type inferred for 'x' is number and the type inferred for 's' is string.
Return the type associated with a variable parameter or property declaration . In the simple case this is the type specified in a type annotation or inferred from an initializer . However in the case of a destructuring declaration it is a bit more involved . For example : var [ x s = ] = [ 1 one ] ; Here the array literal [ 1 one ] is contextually typed by the type [ any string ] which is the implied type of the binding pattern [ x s = ] . Because the contextual type is a tuple type the resulting type of [ 1 one ] is the tuple type [ number string ] . Thus the type inferred for x is number and the type inferred for s is string .