@@ -18355,16 +18355,31 @@ namespace ts {
18355
18355
return getNameFromJsxElementAttributesContainer(JsxNames.ElementChildrenAttributeNameContainer, jsxNamespace);
18356
18356
}
18357
18357
18358
- function getUninstantiatedJsxSignaturesOfType(elementType: Type): ReadonlyArray<Signature> {
18358
+ function getUninstantiatedJsxSignaturesOfType(elementType: Type, caller: JsxOpeningLikeElement): ReadonlyArray<Signature> {
18359
+ if (elementType.flags & TypeFlags.String) {
18360
+ return [anySignature];
18361
+ }
18362
+ else if (elementType.flags & TypeFlags.StringLiteral) {
18363
+ const intrinsicType = getIntrinsicAttributesTypeFromStringLiteralType(elementType as StringLiteralType, caller);
18364
+ if (!intrinsicType) {
18365
+ error(caller, Diagnostics.Property_0_does_not_exist_on_type_1, (elementType as StringLiteralType).value, "JSX." + JsxNames.IntrinsicElements);
18366
+ return emptyArray;
18367
+ }
18368
+ else {
18369
+ const fakeSignature = createSignatureForJSXIntrinsic(caller, intrinsicType);
18370
+ return [fakeSignature];
18371
+ }
18372
+ }
18373
+ const apparentElemType = getApparentType(elementType);
18359
18374
// Resolve the signatures, preferring constructor
18360
- let signatures = getSignaturesOfType(elementType , SignatureKind.Construct);
18375
+ let signatures = getSignaturesOfType(apparentElemType , SignatureKind.Construct);
18361
18376
if (signatures.length === 0) {
18362
18377
// No construct signatures, try call signatures
18363
- signatures = getSignaturesOfType(elementType , SignatureKind.Call);
18378
+ signatures = getSignaturesOfType(apparentElemType , SignatureKind.Call);
18364
18379
}
18365
- if (signatures.length === 0 && elementType .flags & TypeFlags.Union) {
18380
+ if (signatures.length === 0 && apparentElemType .flags & TypeFlags.Union) {
18366
18381
// If each member has some combination of new/call signatures; make a union signature list for those
18367
- signatures = getUnionSignatures(map((elementType as UnionType).types, getUninstantiatedJsxSignaturesOfType));
18382
+ signatures = getUnionSignatures(map((apparentElemType as UnionType).types, t => getUninstantiatedJsxSignaturesOfType(t, caller) ));
18368
18383
}
18369
18384
return signatures;
18370
18385
}
@@ -20547,21 +20562,8 @@ namespace ts {
20547
20562
return resolveErrorCall(node);
20548
20563
}
20549
20564
20550
- if (exprTypes.flags & TypeFlags.StringLiteral) {
20551
- const intrinsicType = getIntrinsicAttributesTypeFromStringLiteralType(exprTypes as StringLiteralType, node);
20552
- if (!intrinsicType) {
20553
- error(node, Diagnostics.Property_0_does_not_exist_on_type_1, (exprTypes as StringLiteralType).value, "JSX." + JsxNames.IntrinsicElements);
20554
- return resolveUntypedCall(node);
20555
- }
20556
- else {
20557
- const fakeSignature = createSignatureForJSXIntrinsic(node, intrinsicType);
20558
- checkTypeAssignableToAndOptionallyElaborate(checkExpressionWithContextualType(node.attributes, getEffectiveFirstArgumentForJsxSignature(fakeSignature, node), /*mapper*/ undefined), intrinsicType, node.tagName, node.attributes);
20559
- return fakeSignature;
20560
- }
20561
- }
20562
-
20563
- const signatures = getUninstantiatedJsxSignaturesOfType(apparentType);
20564
- if (exprTypes.flags & TypeFlags.String || isUntypedFunctionCall(exprTypes, apparentType, signatures.length, /*constructSignatures*/ 0)) {
20565
+ const signatures = getUninstantiatedJsxSignaturesOfType(exprTypes, node);
20566
+ if (isUntypedFunctionCall(exprTypes, apparentType, signatures.length, /*constructSignatures*/ 0)) {
20565
20567
return resolveUntypedCall(node);
20566
20568
}
20567
20569
0 commit comments