@@ -22785,7 +22785,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2278522785 findMostOverlappyType(source, target);
2278622786 }
2278722787
22788- function discriminateTypeByDiscriminableItems(target: UnionType, discriminators: [() => Type, __String][], related: (source: Type, target: Type) => boolean | Ternary) {
22788+ function discriminateTypeByDiscriminableItems(target: UnionType, discriminators: (readonly [() => Type, __String]) [], related: (source: Type, target: Type) => boolean | Ternary) {
2278922789 const types = target.types;
2279022790 const include: Ternary[] = types.map(t => t.flags & TypeFlags.Primitive ? Ternary.False : Ternary.True);
2279122791 for (const [getDiscriminatingType, propertyName] of discriminators) {
@@ -29438,12 +29438,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2943829438 return getMatchingUnionConstituentForObjectLiteral(contextualType, node) || discriminateTypeByDiscriminableItems(contextualType,
2943929439 concatenate(
2944029440 map(
29441- filter(node.properties, p => !!p.symbol && p.kind === SyntaxKind.PropertyAssignment && isPossiblyDiscriminantValue(p.initializer) && isDiscriminantProperty(contextualType, p.symbol.escapedName)),
29442- prop => ([() => getContextFreeTypeOfExpression((prop as PropertyAssignment).initializer), prop.symbol.escapedName] as [() => Type, __String])
29441+ filter(node.properties, (p): p is PropertyAssignment | ShorthandPropertyAssignment => {
29442+ if (!p.symbol) {
29443+ return false;
29444+ }
29445+ if (p.kind === SyntaxKind.PropertyAssignment) {
29446+ return isPossiblyDiscriminantValue(p.initializer) && isDiscriminantProperty(contextualType, p.symbol.escapedName);
29447+ }
29448+ if (p.kind === SyntaxKind.ShorthandPropertyAssignment) {
29449+ return isDiscriminantProperty(contextualType, p.symbol.escapedName);
29450+ }
29451+ return false;
29452+ }),
29453+ prop => ([() => getContextFreeTypeOfExpression(prop.kind === SyntaxKind.PropertyAssignment ? prop.initializer : prop.name), prop.symbol.escapedName] as const)
2944329454 ),
2944429455 map(
2944529456 filter(getPropertiesOfType(contextualType), s => !!(s.flags & SymbolFlags.Optional) && !!node?.symbol?.members && !node.symbol.members.has(s.escapedName) && isDiscriminantProperty(contextualType, s.escapedName)),
29446- s => [() => undefinedType, s.escapedName] as [() => Type, __String]
29457+ s => [() => undefinedType, s.escapedName] as const
2944729458 )
2944829459 ),
2944929460 isTypeAssignableTo
@@ -29456,7 +29467,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2945629467 concatenate(
2945729468 map(
2945829469 filter(node.properties, p => !!p.symbol && p.kind === SyntaxKind.JsxAttribute && isDiscriminantProperty(contextualType, p.symbol.escapedName) && (!p.initializer || isPossiblyDiscriminantValue(p.initializer))),
29459- prop => ([!(prop as JsxAttribute).initializer ? (() => trueType) : (() => getContextFreeTypeOfExpression((prop as JsxAttribute).initializer!)), prop.symbol.escapedName] as [() => Type, __String] )
29470+ prop => ([!(prop as JsxAttribute).initializer ? (() => trueType) : (() => getContextFreeTypeOfExpression((prop as JsxAttribute).initializer!)), prop.symbol.escapedName] as const )
2946029471 ),
2946129472 map(
2946229473 filter(getPropertiesOfType(contextualType), s => {
@@ -29469,7 +29480,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2946929480 }
2947029481 return !node.symbol.members.has(s.escapedName) && isDiscriminantProperty(contextualType, s.escapedName);
2947129482 }),
29472- s => [() => undefinedType, s.escapedName] as [() => Type, __String]
29483+ s => [() => undefinedType, s.escapedName] as const
2947329484 )
2947429485 ),
2947529486 isTypeAssignableTo
0 commit comments