diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b1f73584c4901..124dd3630d530 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -18430,6 +18430,10 @@ namespace ts { childrenPropSymbol.type = childrenTypes.length === 1 ? childrenTypes[0] : (getArrayLiteralTupleTypeIfApplicable(childrenTypes, childrenContextualType, /*hasRestElement*/ false) || createArrayType(getUnionType(childrenTypes))); + // Fake up a property declaration for the children + childrenPropSymbol.valueDeclaration = createPropertySignature(/*modifiers*/ undefined, unescapeLeadingUnderscores(jsxChildrenPropertyName), /*questionToken*/ undefined, /*type*/ undefined, /*initializer*/ undefined); + childrenPropSymbol.valueDeclaration.parent = attributes; + childrenPropSymbol.valueDeclaration.symbol = childrenPropSymbol; const childPropMap = createSymbolTable(); childPropMap.set(jsxChildrenPropertyName, childrenPropSymbol); spread = getSpreadType(spread, createAnonymousType(attributes.symbol, childPropMap, emptyArray, emptyArray, /*stringIndexInfo*/ undefined, /*numberIndexInfo*/ undefined), diff --git a/tests/baselines/reference/checkJsxChildrenProperty15.errors.txt b/tests/baselines/reference/checkJsxChildrenProperty15.errors.txt new file mode 100644 index 0000000000000..605a293ffaab3 --- /dev/null +++ b/tests/baselines/reference/checkJsxChildrenProperty15.errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/jsx/file.tsx(10,13): error TS2322: Type '{ children: Element; }' is not assignable to type 'IntrinsicAttributes'. + Property 'children' does not exist on type 'IntrinsicAttributes'. +tests/cases/conformance/jsx/file.tsx(11,13): error TS2322: Type '{ children: Element; key: string; }' is not assignable to type 'IntrinsicAttributes'. + Property 'children' does not exist on type 'IntrinsicAttributes'. +tests/cases/conformance/jsx/file.tsx(12,13): error TS2322: Type '{ children: Element[]; key: string; }' is not assignable to type 'IntrinsicAttributes'. + Property 'children' does not exist on type 'IntrinsicAttributes'. + + +==== tests/cases/conformance/jsx/file.tsx (3 errors) ==== + import React = require('react'); + + const Tag = (x: {}) =>
; + + // OK + const k1 = ; + const k2 = ; + + // Not OK (excess children) + const k3 = } />; + ~~~ +!!! error TS2322: Type '{ children: Element; }' is not assignable to type 'IntrinsicAttributes'. +!!! error TS2322: Property 'children' does not exist on type 'IntrinsicAttributes'. + const k4 =
; + ~~~ +!!! error TS2322: Type '{ children: Element; key: string; }' is not assignable to type 'IntrinsicAttributes'. +!!! error TS2322: Property 'children' does not exist on type 'IntrinsicAttributes'. + const k5 =
; + ~~~ +!!! error TS2322: Type '{ children: Element[]; key: string; }' is not assignable to type 'IntrinsicAttributes'. +!!! error TS2322: Property 'children' does not exist on type 'IntrinsicAttributes'. + \ No newline at end of file diff --git a/tests/baselines/reference/checkJsxChildrenProperty15.js b/tests/baselines/reference/checkJsxChildrenProperty15.js new file mode 100644 index 0000000000000..9ceaa97cc3999 --- /dev/null +++ b/tests/baselines/reference/checkJsxChildrenProperty15.js @@ -0,0 +1,27 @@ +//// [file.tsx] +import React = require('react'); + +const Tag = (x: {}) =>
; + +// OK +const k1 = ; +const k2 = ; + +// Not OK (excess children) +const k3 = } />; +const k4 =
; +const k5 =
; + + +//// [file.jsx] +"use strict"; +exports.__esModule = true; +var React = require("react"); +var Tag = function (x) { return
; }; +// OK +var k1 = ; +var k2 = ; +// Not OK (excess children) +var k3 = }/>; +var k4 =
; +var k5 =
; diff --git a/tests/baselines/reference/checkJsxChildrenProperty15.symbols b/tests/baselines/reference/checkJsxChildrenProperty15.symbols new file mode 100644 index 0000000000000..ec8e0ab5b0b5e --- /dev/null +++ b/tests/baselines/reference/checkJsxChildrenProperty15.symbols @@ -0,0 +1,46 @@ +=== tests/cases/conformance/jsx/file.tsx === +import React = require('react'); +>React : Symbol(React, Decl(file.tsx, 0, 0)) + +const Tag = (x: {}) =>
; +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) +>x : Symbol(x, Decl(file.tsx, 2, 13)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) + +// OK +const k1 = ; +>k1 : Symbol(k1, Decl(file.tsx, 5, 5)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) + +const k2 = ; +>k2 : Symbol(k2, Decl(file.tsx, 6, 5)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) + +// Not OK (excess children) +const k3 = } />; +>k3 : Symbol(k3, Decl(file.tsx, 9, 5)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) +>children : Symbol(children, Decl(file.tsx, 9, 15)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) + +const k4 =
; +>k4 : Symbol(k4, Decl(file.tsx, 10, 5)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) +>key : Symbol(key, Decl(file.tsx, 10, 15)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) + +const k5 =
; +>k5 : Symbol(k5, Decl(file.tsx, 11, 5)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) +>key : Symbol(key, Decl(file.tsx, 11, 15)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>div : Symbol(JSX.IntrinsicElements.div, Decl(react.d.ts, 2400, 45)) +>Tag : Symbol(Tag, Decl(file.tsx, 2, 5)) + diff --git a/tests/baselines/reference/checkJsxChildrenProperty15.types b/tests/baselines/reference/checkJsxChildrenProperty15.types new file mode 100644 index 0000000000000..00b70f990fc17 --- /dev/null +++ b/tests/baselines/reference/checkJsxChildrenProperty15.types @@ -0,0 +1,57 @@ +=== tests/cases/conformance/jsx/file.tsx === +import React = require('react'); +>React : typeof React + +const Tag = (x: {}) =>
; +>Tag : (x: {}) => JSX.Element +>(x: {}) =>
: (x: {}) => JSX.Element +>x : {} +>
: JSX.Element +>div : any +>div : any + +// OK +const k1 = ; +>k1 : JSX.Element +> : JSX.Element +>Tag : (x: {}) => JSX.Element + +const k2 = ; +>k2 : JSX.Element +> : JSX.Element +>Tag : (x: {}) => JSX.Element +>Tag : (x: {}) => JSX.Element + +// Not OK (excess children) +const k3 = } />; +>k3 : JSX.Element +>} /> : JSX.Element +>Tag : (x: {}) => JSX.Element +>children : JSX.Element +>
: JSX.Element +>div : any +>div : any + +const k4 =
; +>k4 : JSX.Element +>
: JSX.Element +>Tag : (x: {}) => JSX.Element +>key : string +>
: JSX.Element +>div : any +>div : any +>Tag : (x: {}) => JSX.Element + +const k5 =
; +>k5 : JSX.Element +>
: JSX.Element +>Tag : (x: {}) => JSX.Element +>key : string +>
: JSX.Element +>div : any +>div : any +>
: JSX.Element +>div : any +>div : any +>Tag : (x: {}) => JSX.Element + diff --git a/tests/baselines/reference/tsxStatelessFunctionComponentOverload4.errors.txt b/tests/baselines/reference/tsxStatelessFunctionComponentOverload4.errors.txt index 2e88e0a20015c..733bb200e9960 100644 --- a/tests/baselines/reference/tsxStatelessFunctionComponentOverload4.errors.txt +++ b/tests/baselines/reference/tsxStatelessFunctionComponentOverload4.errors.txt @@ -12,9 +12,10 @@ tests/cases/conformance/jsx/file.tsx(26,40): error TS2322: Type 'string' is not tests/cases/conformance/jsx/file.tsx(33,32): error TS2322: Type 'string' is not assignable to type 'boolean'. tests/cases/conformance/jsx/file.tsx(34,29): error TS2322: Type 'string' is not assignable to type 'boolean'. tests/cases/conformance/jsx/file.tsx(35,29): error TS2322: Type 'string' is not assignable to type 'boolean'. +tests/cases/conformance/jsx/file.tsx(36,29): error TS2322: Type 'string' is not assignable to type 'boolean'. -==== tests/cases/conformance/jsx/file.tsx (10 errors) ==== +==== tests/cases/conformance/jsx/file.tsx (11 errors) ==== import React = require('react') declare function OneThing(): JSX.Element; declare function OneThing(l: {yy: number, yy1: string}): JSX.Element; @@ -82,4 +83,7 @@ tests/cases/conformance/jsx/file.tsx(35,29): error TS2322: Type 'string' is not !!! error TS2322: Type 'string' is not assignable to type 'boolean'. !!! related TS6500 tests/cases/conformance/jsx/file.tsx:30:38: The expected type comes from property 'y1' which is declared here on type 'IntrinsicAttributes & { y1: boolean; y2?: number; y3: boolean; }' const e4 = Hi + ~~ +!!! error TS2322: Type 'string' is not assignable to type 'boolean'. +!!! related TS6500 tests/cases/conformance/jsx/file.tsx:30:38: The expected type comes from property 'y1' which is declared here on type 'IntrinsicAttributes & { y1: boolean; y2?: number; y3: boolean; }' \ No newline at end of file diff --git a/tests/cases/conformance/jsx/checkJsxChildrenProperty15.tsx b/tests/cases/conformance/jsx/checkJsxChildrenProperty15.tsx new file mode 100644 index 0000000000000..7f91b9516dd71 --- /dev/null +++ b/tests/cases/conformance/jsx/checkJsxChildrenProperty15.tsx @@ -0,0 +1,18 @@ +// @filename: file.tsx +// @jsx: preserve +// @noLib: true +// @skipLibCheck: true +// @libFiles: react.d.ts,lib.d.ts + +import React = require('react'); + +const Tag = (x: {}) =>
; + +// OK +const k1 = ; +const k2 = ; + +// Not OK (excess children) +const k3 = } />; +const k4 =
; +const k5 =
;