(type, operator, value, assumeTrue)
| 70987 | return removeNullable ? getTypeWithFacts(type, 2097152 /* TypeFacts.NEUndefinedOrNull */) : type; |
| 70988 | } |
| 70989 | function narrowTypeByEquality(type, operator, value, assumeTrue) { |
| 70990 | if (type.flags & 1 /* TypeFlags.Any */) { |
| 70991 | return type; |
| 70992 | } |
| 70993 | if (operator === 35 /* SyntaxKind.ExclamationEqualsToken */ || operator === 37 /* SyntaxKind.ExclamationEqualsEqualsToken */) { |
| 70994 | assumeTrue = !assumeTrue; |
| 70995 | } |
| 70996 | var valueType = getTypeOfExpression(value); |
| 70997 | if (assumeTrue && (type.flags & 2 /* TypeFlags.Unknown */) && (operator === 34 /* SyntaxKind.EqualsEqualsToken */ || operator === 35 /* SyntaxKind.ExclamationEqualsToken */) && (valueType.flags & 65536 /* TypeFlags.Null */)) { |
| 70998 | return getUnionType([nullType, undefinedType]); |
| 70999 | } |
| 71000 | if ((type.flags & 2 /* TypeFlags.Unknown */) && assumeTrue && (operator === 36 /* SyntaxKind.EqualsEqualsEqualsToken */ || operator === 37 /* SyntaxKind.ExclamationEqualsEqualsToken */)) { |
| 71001 | if (valueType.flags & (131068 /* TypeFlags.Primitive */ | 67108864 /* TypeFlags.NonPrimitive */)) { |
| 71002 | return valueType; |
| 71003 | } |
| 71004 | if (valueType.flags & 524288 /* TypeFlags.Object */) { |
| 71005 | return nonPrimitiveType; |
| 71006 | } |
| 71007 | return type; |
| 71008 | } |
| 71009 | if (valueType.flags & 98304 /* TypeFlags.Nullable */) { |
| 71010 | if (!strictNullChecks) { |
| 71011 | return type; |
| 71012 | } |
| 71013 | var doubleEquals = operator === 34 /* SyntaxKind.EqualsEqualsToken */ || operator === 35 /* SyntaxKind.ExclamationEqualsToken */; |
| 71014 | var facts = doubleEquals ? |
| 71015 | assumeTrue ? 262144 /* TypeFacts.EQUndefinedOrNull */ : 2097152 /* TypeFacts.NEUndefinedOrNull */ : |
| 71016 | valueType.flags & 65536 /* TypeFlags.Null */ ? |
| 71017 | assumeTrue ? 131072 /* TypeFacts.EQNull */ : 1048576 /* TypeFacts.NENull */ : |
| 71018 | assumeTrue ? 65536 /* TypeFacts.EQUndefined */ : 524288 /* TypeFacts.NEUndefined */; |
| 71019 | return type.flags & 2 /* TypeFlags.Unknown */ && facts & (1048576 /* TypeFacts.NENull */ | 2097152 /* TypeFacts.NEUndefinedOrNull */) ? nonNullUnknownType : getTypeWithFacts(type, facts); |
| 71020 | } |
| 71021 | if (assumeTrue) { |
| 71022 | var filterFn = operator === 34 /* SyntaxKind.EqualsEqualsToken */ ? |
| 71023 | function (t) { return areTypesComparable(t, valueType) || isCoercibleUnderDoubleEquals(t, valueType); } : |
| 71024 | function (t) { return areTypesComparable(t, valueType); }; |
| 71025 | return replacePrimitivesWithLiterals(filterType(type, filterFn), valueType); |
| 71026 | } |
| 71027 | if (isUnitType(valueType)) { |
| 71028 | return filterType(type, function (t) { return !(isUnitLikeType(t) && areTypesComparable(t, valueType)); }); |
| 71029 | } |
| 71030 | return type; |
| 71031 | } |
| 71032 | function narrowTypeByTypeof(type, typeOfExpr, operator, literal, assumeTrue) { |
| 71033 | // We have '==', '!=', '===', or !==' operator with 'typeof xxx' and string literal operands |
| 71034 | if (operator === 35 /* SyntaxKind.ExclamationEqualsToken */ || operator === 37 /* SyntaxKind.ExclamationEqualsEqualsToken */) { |
no test coverage detected