Skip to content

Commit 0815afd

Browse files
committed
Fix react-jsx spread children invalid emit
1 parent 8173afb commit 0815afd

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/compiler/transformers/jsx.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ namespace ts {
206206

207207
function convertJsxChildrenToChildrenPropAssignment(children: readonly JsxChild[]) {
208208
const nonWhitespaceChildren = getSemanticJsxChildren(children);
209-
if (length(nonWhitespaceChildren) === 1) {
209+
if (length(nonWhitespaceChildren) === 1 && !(nonWhitespaceChildren[0] as JsxExpression).dotDotDotToken) {
210210
const result = transformJsxChildToExpression(nonWhitespaceChildren[0]);
211211
return result && factory.createPropertyAssignment("children", result);
212212
}
@@ -221,7 +221,15 @@ namespace ts {
221221
const attrs = keyAttr ? filter(node.attributes.properties, p => p !== keyAttr) : node.attributes.properties;
222222
const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs, childrenProp) :
223223
factory.createObjectLiteralExpression(childrenProp ? [childrenProp] : emptyArray); // When there are no attributes, React wants {}
224-
return visitJsxOpeningLikeElementOrFragmentJSX(tagName, objectProperties, keyAttr, length(getSemanticJsxChildren(children || emptyArray)), isChild, location);
224+
const nonWhitespaceChildren = getSemanticJsxChildren(children || emptyArray);
225+
return visitJsxOpeningLikeElementOrFragmentJSX(
226+
tagName,
227+
objectProperties,
228+
keyAttr,
229+
(nonWhitespaceChildren[0] as JsxExpression)?.dotDotDotToken ? 2 : length(nonWhitespaceChildren),
230+
isChild,
231+
location
232+
);
225233
}
226234

227235
function visitJsxOpeningLikeElementOrFragmentJSX(tagName: Expression, objectProperties: Expression, keyAttr: JsxAttribute | undefined, childrenLength: number, isChild: boolean, location: TextRange) {
@@ -290,11 +298,12 @@ namespace ts {
290298
childrenProps = result;
291299
}
292300
}
301+
const nonWhitespaceChildren = getSemanticJsxChildren(children);
293302
return visitJsxOpeningLikeElementOrFragmentJSX(
294303
getImplicitJsxFragmentReference(),
295304
childrenProps || factory.createObjectLiteralExpression([]),
296305
/*keyAttr*/ undefined,
297-
length(getSemanticJsxChildren(children)),
306+
(nonWhitespaceChildren[0] as JsxExpression)?.dotDotDotToken ? 2 : length(nonWhitespaceChildren),
298307
isChild,
299308
location
300309
);

tests/cases/conformance/jsx/tsxSpreadChildrenInvalidType.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// @jsx: react
1+
// @jsx: react,react-jsx
22
// @target: es2015,es5
33
declare module JSX {
44
interface Element { }

0 commit comments

Comments
 (0)