//// [typeGuardsInClassAccessors.ts]

// Note that type guards affect types of variables and parameters only and 
// have no effect on members of objects such as properties. 

// variables in global
var num: number;
var strOrNum: string | number;
var var1: string | number;
class ClassWithAccessors {
    // Inside public accessor getter
    get p1() {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string

        return strOrNum;
    }
    // Inside public accessor setter
    set p1(param: string | number) {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // parameter of function declaration
        num = typeof param === "string" && param.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string
    }
    // Inside private accessor getter
    private get pp1() {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string

        return strOrNum;
    }
    // Inside private accessor setter
    private set pp1(param: string | number) {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // parameter of function declaration
        num = typeof param === "string" && param.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string
    }
    // Inside static accessor getter
    static get s1() {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string

        return strOrNum;
    }
    // Inside static accessor setter
    static set s1(param: string | number) {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // parameter of function declaration
        num = typeof param === "string" && param.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string
    }
    // Inside private static accessor getter
    private static get ss1() {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string

        return strOrNum;
    }
    // Inside private static accessor setter
    private static set ss1(param: string | number) {
        // global vars in function declaration
        num = typeof var1 === "string" && var1.length; // string

        // parameter of function declaration
        num = typeof param === "string" && param.length; // string

        // variables in function declaration
        var var2: string | number;
        num = typeof var2 === "string" && var2.length; // string
    }
}


//// [typeGuardsInClassAccessors.js]
// Note that type guards affect types of variables and parameters only and 
// have no effect on members of objects such as properties. 
// variables in global
var num;
var strOrNum;
var var1;
var ClassWithAccessors = (function () {
    function ClassWithAccessors() {
    }
    Object.defineProperty(ClassWithAccessors.prototype, "p1", {
        // Inside public accessor getter
        get: function () {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
            return strOrNum;
        },
        // Inside public accessor setter
        set: function (param) {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // parameter of function declaration
            num = typeof param === "string" && param.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(ClassWithAccessors.prototype, "pp1", {
        // Inside private accessor getter
        get: function () {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
            return strOrNum;
        },
        // Inside private accessor setter
        set: function (param) {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // parameter of function declaration
            num = typeof param === "string" && param.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(ClassWithAccessors, "s1", {
        // Inside static accessor getter
        get: function () {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
            return strOrNum;
        },
        // Inside static accessor setter
        set: function (param) {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // parameter of function declaration
            num = typeof param === "string" && param.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(ClassWithAccessors, "ss1", {
        // Inside private static accessor getter
        get: function () {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
            return strOrNum;
        },
        // Inside private static accessor setter
        set: function (param) {
            // global vars in function declaration
            num = typeof var1 === "string" && var1.length; // string
            // parameter of function declaration
            num = typeof param === "string" && param.length; // string
            // variables in function declaration
            var var2;
            num = typeof var2 === "string" && var2.length; // string
        },
        enumerable: true,
        configurable: true
    });
    return ClassWithAccessors;
})();
