demo/typescript.js
function removeTypesFromUnionType(type, typeKind, isOfTypeKind, allowEmptyUnionResult) {
            if (type.flags & 16384 /* Union */) {
                var types = type.types;
                if (ts.forEach(types, function (t) { return !!(t.flags & typeKind) === isOfTypeKind; })) {
                    // Above we checked if we have anything to remove, now use the opposite test to do the removal
                    var narrowedType = getUnionType(ts.filter(types, function (t) { return !(t.flags & typeKind) === isOfTypeKind; }));
                    if (allowEmptyUnionResult || narrowedType !== emptyObjectType) {
                        return narrowedType;
                    }
                }
            }
            else if (allowEmptyUnionResult && !!(type.flags & typeKind) === isOfTypeKind) {
                // Use getUnionType(emptyArray) instead of emptyObjectType in case the way empty union types
                // are represented ever changes.
                return getUnionType(emptyArray);
            }
            return type;
        }
function removeTypesFromUnionType(type, typeKind, isOfTypeKind, allowEmptyUnionResult) {
            if (type.flags & 16384 /* Union */) {
                var types = type.types;
                if (ts.forEach(types, function (t) { return !!(t.flags & typeKind) === isOfTypeKind; })) {
                    // Above we checked if we have anything to remove, now use the opposite test to do the removal
                    var narrowedType = getUnionType(ts.filter(types, function (t) { return !(t.flags & typeKind) === isOfTypeKind; }));
                    if (allowEmptyUnionResult || narrowedType !== emptyObjectType) {
                        return narrowedType;
                    }
                }
            }
            else if (allowEmptyUnionResult && !!(type.flags & typeKind) === isOfTypeKind) {
                // Use getUnionType(emptyArray) instead of emptyObjectType in case the way empty union types
                // are represented ever changes.
                return getUnionType(emptyArray);
            }
            return type;
        }
function removeTypesFromUnionType ( type , typeKind , isOfTypeKind , allowEmptyUnionResult ) { if ( type . flags & 16384 /* Union */ ) { var types = type . types ; if ( ts . forEach ( types , function ( t ) { return ! ! ( t . flags & typeKind ) === isOfTypeKind ; } ) ) { // Above we checked if we have anything to remove, now use the opposite test to do the removal var narrowedType = getUnionType ( ts . filter ( types , function ( t ) { return ! ( t . flags & typeKind ) === isOfTypeKind ; } ) ) ; if ( allowEmptyUnionResult || narrowedType !== emptyObjectType ) { return narrowedType ; } } } else if ( allowEmptyUnionResult && ! ! ( type . flags & typeKind ) === isOfTypeKind ) { // Use getUnionType(emptyArray) instead of emptyObjectType in case the way empty union types // are represented ever changes. return getUnionType ( emptyArray ) ; } return type ; }
For a union type, remove all constituent types that are of the given type kind (when isOfTypeKind is true) or not of the given type kind (when isOfTypeKind is false)
For a union type remove all constituent types that are of the given type kind ( when isOfTypeKind is true ) or not of the given type kind ( when isOfTypeKind is false )