mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge pull request #15566 from Microsoft/master-fix15469
[Master] Port fix15469
This commit is contained in:
+23
-19
@@ -13248,6 +13248,8 @@ namespace ts {
|
||||
let attributesTable = createMap<Symbol>();
|
||||
let spread: Type = emptyObjectType;
|
||||
let attributesArray: Symbol[] = [];
|
||||
let hasSpreadAnyType = false;
|
||||
|
||||
for (const attributeDecl of attributes.properties) {
|
||||
const member = attributeDecl.symbol;
|
||||
if (isJsxAttribute(attributeDecl)) {
|
||||
@@ -13276,31 +13278,33 @@ namespace ts {
|
||||
const exprType = checkExpression(attributeDecl.expression);
|
||||
if (!isValidSpreadType(exprType)) {
|
||||
error(attributeDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
|
||||
return anyType;
|
||||
hasSpreadAnyType = true;
|
||||
}
|
||||
if (isTypeAny(exprType)) {
|
||||
return anyType;
|
||||
hasSpreadAnyType = true;
|
||||
}
|
||||
spread = getSpreadType(spread, exprType);
|
||||
}
|
||||
}
|
||||
|
||||
if (spread !== emptyObjectType) {
|
||||
if (attributesArray.length > 0) {
|
||||
spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable));
|
||||
attributesArray = [];
|
||||
attributesTable = createMap<Symbol>();
|
||||
}
|
||||
attributesArray = getPropertiesOfType(spread);
|
||||
}
|
||||
|
||||
attributesTable = createMap<Symbol>();
|
||||
if (attributesArray) {
|
||||
forEach(attributesArray, (attr) => {
|
||||
if (!filter || filter(attr)) {
|
||||
attributesTable.set(attr.name, attr);
|
||||
if (!hasSpreadAnyType) {
|
||||
if (spread !== emptyObjectType) {
|
||||
if (attributesArray.length > 0) {
|
||||
spread = getSpreadType(spread, createJsxAttributesType(attributes.symbol, attributesTable));
|
||||
attributesArray = [];
|
||||
attributesTable = createMap<Symbol>();
|
||||
}
|
||||
});
|
||||
attributesArray = getPropertiesOfType(spread);
|
||||
}
|
||||
|
||||
attributesTable = createMap<Symbol>();
|
||||
if (attributesArray) {
|
||||
forEach(attributesArray, (attr) => {
|
||||
if (!filter || filter(attr)) {
|
||||
attributesTable.set(attr.name, attr);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Handle children attribute
|
||||
@@ -13324,7 +13328,7 @@ namespace ts {
|
||||
// Error if there is a attribute named "children" and children element.
|
||||
// This is because children element will overwrite the value from attributes
|
||||
const jsxChildrenPropertyName = getJsxElementChildrenPropertyname();
|
||||
if (jsxChildrenPropertyName && jsxChildrenPropertyName !== "") {
|
||||
if (!hasSpreadAnyType && jsxChildrenPropertyName && jsxChildrenPropertyName !== "") {
|
||||
if (attributesTable.has(jsxChildrenPropertyName)) {
|
||||
error(attributes, Diagnostics._0_are_specified_twice_The_attribute_named_0_will_be_overwritten, jsxChildrenPropertyName);
|
||||
}
|
||||
@@ -13338,7 +13342,7 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
return createJsxAttributesType(attributes.symbol, attributesTable);
|
||||
return hasSpreadAnyType ? anyType : createJsxAttributesType(attributes.symbol, attributesTable);
|
||||
|
||||
/**
|
||||
* Create anonymous type from given attributes symbol table.
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
//// [tests/cases/conformance/jsx/correctlyMarkAliasAsReferences1.tsx] ////
|
||||
|
||||
//// [declaration.d.ts]
|
||||
declare module "classnames";
|
||||
|
||||
//// [0.tsx]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps; // any
|
||||
let k = <button {...buttonProps}>
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
</button>;
|
||||
|
||||
|
||||
//// [0.js]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
let buttonProps; // any
|
||||
let k = React.createElement("button", Object.assign({}, buttonProps),
|
||||
React.createElement("span", { className: cx('class1', { class2: true }) }));
|
||||
@@ -0,0 +1,29 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
|
||||
import * as React from "react";
|
||||
>React : Symbol(React, Decl(0.tsx, 2, 6))
|
||||
|
||||
let buttonProps; // any
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
|
||||
let k = <button {...buttonProps}>
|
||||
>k : Symbol(k, Decl(0.tsx, 5, 3))
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
>span : Symbol(JSX.IntrinsicElements.span, Decl(react.d.ts, 2460, 51))
|
||||
>className : Symbol(className, Decl(0.tsx, 6, 17))
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
>class2 : Symbol(class2, Decl(0.tsx, 6, 43))
|
||||
|
||||
</button>;
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,35 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : any
|
||||
|
||||
import * as React from "react";
|
||||
>React : typeof React
|
||||
|
||||
let buttonProps; // any
|
||||
>buttonProps : any
|
||||
|
||||
let k = <button {...buttonProps}>
|
||||
>k : JSX.Element
|
||||
><button {...buttonProps}> <span className={cx('class1', { class2: true })} /> </button> : JSX.Element
|
||||
>button : any
|
||||
>buttonProps : any
|
||||
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
><span className={cx('class1', { class2: true })} /> : JSX.Element
|
||||
>span : any
|
||||
>className : any
|
||||
>cx('class1', { class2: true }) : any
|
||||
>cx : any
|
||||
>'class1' : "class1"
|
||||
>{ class2: true } : { class2: boolean; }
|
||||
>class2 : boolean
|
||||
>true : true
|
||||
|
||||
</button>;
|
||||
>button : any
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,23 @@
|
||||
//// [tests/cases/conformance/jsx/correctlyMarkAliasAsReferences2.tsx] ////
|
||||
|
||||
//// [declaration.d.ts]
|
||||
declare module "classnames";
|
||||
|
||||
//// [0.tsx]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
let k = <button {...buttonProps}>
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
</button>;
|
||||
|
||||
|
||||
//// [0.js]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
let buttonProps;
|
||||
let k = React.createElement("button", Object.assign({}, buttonProps),
|
||||
React.createElement("span", { className: cx('class1', { class2: true }) }));
|
||||
@@ -0,0 +1,30 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
|
||||
import * as React from "react";
|
||||
>React : Symbol(React, Decl(0.tsx, 2, 6))
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
>attributeName : Symbol(attributeName, Decl(0.tsx, 4, 20))
|
||||
|
||||
let k = <button {...buttonProps}>
|
||||
>k : Symbol(k, Decl(0.tsx, 5, 3))
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
>span : Symbol(JSX.IntrinsicElements.span, Decl(react.d.ts, 2460, 51))
|
||||
>className : Symbol(className, Decl(0.tsx, 6, 17))
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
>class2 : Symbol(class2, Decl(0.tsx, 6, 43))
|
||||
|
||||
</button>;
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,36 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : any
|
||||
|
||||
import * as React from "react";
|
||||
>React : typeof React
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
>buttonProps : { [attributeName: string]: ""; }
|
||||
>attributeName : string
|
||||
|
||||
let k = <button {...buttonProps}>
|
||||
>k : JSX.Element
|
||||
><button {...buttonProps}> <span className={cx('class1', { class2: true })} /> </button> : JSX.Element
|
||||
>button : any
|
||||
>buttonProps : { [attributeName: string]: ""; }
|
||||
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
><span className={cx('class1', { class2: true })} /> : JSX.Element
|
||||
>span : any
|
||||
>className : any
|
||||
>cx('class1', { class2: true }) : any
|
||||
>cx : any
|
||||
>'class1' : "class1"
|
||||
>{ class2: true } : { class2: boolean; }
|
||||
>class2 : boolean
|
||||
>true : true
|
||||
|
||||
</button>;
|
||||
>button : any
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,23 @@
|
||||
//// [tests/cases/conformance/jsx/correctlyMarkAliasAsReferences3.tsx] ////
|
||||
|
||||
//// [declaration.d.ts]
|
||||
declare module "classnames";
|
||||
|
||||
//// [0.tsx]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps;
|
||||
let k = <button {...buttonProps}>
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
</button>;
|
||||
|
||||
|
||||
//// [0.js]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
let buttonProps;
|
||||
let k = React.createElement("button", Object.assign({}, buttonProps),
|
||||
React.createElement("span", { className: cx('class1', { class2: true }) }));
|
||||
@@ -0,0 +1,29 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
|
||||
import * as React from "react";
|
||||
>React : Symbol(React, Decl(0.tsx, 2, 6))
|
||||
|
||||
let buttonProps;
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
|
||||
let k = <button {...buttonProps}>
|
||||
>k : Symbol(k, Decl(0.tsx, 5, 3))
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
>span : Symbol(JSX.IntrinsicElements.span, Decl(react.d.ts, 2460, 51))
|
||||
>className : Symbol(className, Decl(0.tsx, 6, 17))
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
>class2 : Symbol(class2, Decl(0.tsx, 6, 43))
|
||||
|
||||
</button>;
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,35 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : any
|
||||
|
||||
import * as React from "react";
|
||||
>React : typeof React
|
||||
|
||||
let buttonProps;
|
||||
>buttonProps : any
|
||||
|
||||
let k = <button {...buttonProps}>
|
||||
>k : JSX.Element
|
||||
><button {...buttonProps}> <span className={cx('class1', { class2: true })} /> </button> : JSX.Element
|
||||
>button : any
|
||||
>buttonProps : undefined
|
||||
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
><span className={cx('class1', { class2: true })} /> : JSX.Element
|
||||
>span : any
|
||||
>className : any
|
||||
>cx('class1', { class2: true }) : any
|
||||
>cx : any
|
||||
>'class1' : "class1"
|
||||
>{ class2: true } : { class2: boolean; }
|
||||
>class2 : boolean
|
||||
>true : true
|
||||
|
||||
</button>;
|
||||
>button : any
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,19 @@
|
||||
//// [tests/cases/conformance/jsx/correctlyMarkAliasAsReferences4.tsx] ////
|
||||
|
||||
//// [declaration.d.ts]
|
||||
declare module "classnames";
|
||||
|
||||
//// [0.tsx]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
let k = <button {...buttonProps} className={cx('class1', { class2: true })} />;
|
||||
|
||||
//// [0.js]
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
let buttonProps;
|
||||
let k = React.createElement("button", Object.assign({}, buttonProps, { className: cx('class1', { class2: true }) }));
|
||||
@@ -0,0 +1,24 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
|
||||
import * as React from "react";
|
||||
>React : Symbol(React, Decl(0.tsx, 2, 6))
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
>attributeName : Symbol(attributeName, Decl(0.tsx, 4, 20))
|
||||
|
||||
let k = <button {...buttonProps} className={cx('class1', { class2: true })} />;
|
||||
>k : Symbol(k, Decl(0.tsx, 5, 3))
|
||||
>button : Symbol(JSX.IntrinsicElements.button, Decl(react.d.ts, 2385, 43))
|
||||
>buttonProps : Symbol(buttonProps, Decl(0.tsx, 4, 3))
|
||||
>className : Symbol(className, Decl(0.tsx, 5, 32))
|
||||
>cx : Symbol(cx, Decl(0.tsx, 1, 6))
|
||||
>class2 : Symbol(class2, Decl(0.tsx, 5, 58))
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
@@ -0,0 +1,29 @@
|
||||
=== tests/cases/conformance/jsx/0.tsx ===
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
>cx : any
|
||||
|
||||
import * as React from "react";
|
||||
>React : typeof React
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
>buttonProps : { [attributeName: string]: ""; }
|
||||
>attributeName : string
|
||||
|
||||
let k = <button {...buttonProps} className={cx('class1', { class2: true })} />;
|
||||
>k : JSX.Element
|
||||
><button {...buttonProps} className={cx('class1', { class2: true })} /> : JSX.Element
|
||||
>button : any
|
||||
>buttonProps : { [attributeName: string]: ""; }
|
||||
>className : any
|
||||
>cx('class1', { class2: true }) : any
|
||||
>cx : any
|
||||
>'class1' : "class1"
|
||||
>{ class2: true } : { class2: boolean; }
|
||||
>class2 : boolean
|
||||
>true : true
|
||||
|
||||
=== tests/cases/conformance/jsx/declaration.d.ts ===
|
||||
declare module "classnames";
|
||||
No type information for this code.
|
||||
No type information for this code.
|
||||
+7
-1
@@ -3,10 +3,12 @@ tests/cases/conformance/jsx/file.tsx(10,33): error TS2698: Spread types may only
|
||||
tests/cases/conformance/jsx/file.tsx(11,33): error TS2698: Spread types may only be created from object types.
|
||||
tests/cases/conformance/jsx/file.tsx(12,33): error TS2698: Spread types may only be created from object types.
|
||||
tests/cases/conformance/jsx/file.tsx(14,33): error TS2698: Spread types may only be created from object types.
|
||||
tests/cases/conformance/jsx/file.tsx(14,63): error TS2698: Spread types may only be created from object types.
|
||||
tests/cases/conformance/jsx/file.tsx(15,33): error TS2698: Spread types may only be created from object types.
|
||||
tests/cases/conformance/jsx/file.tsx(15,55): error TS2698: Spread types may only be created from object types.
|
||||
|
||||
|
||||
==== tests/cases/conformance/jsx/file.tsx (6 errors) ====
|
||||
==== tests/cases/conformance/jsx/file.tsx (8 errors) ====
|
||||
import React = require('react')
|
||||
|
||||
declare function OverloadComponent<U>(): JSX.Element;
|
||||
@@ -30,9 +32,13 @@ tests/cases/conformance/jsx/file.tsx(15,33): error TS2698: Spread types may only
|
||||
let a4 = <OverloadComponent />;
|
||||
let a5 = <OverloadComponent {...arg2} ignore-prop="hello" {...arg1} />;
|
||||
~~~~~~~~~
|
||||
!!! error TS2698: Spread types may only be created from object types.
|
||||
~~~~~~~~~
|
||||
!!! error TS2698: Spread types may only be created from object types.
|
||||
let a6 = <OverloadComponent {...arg2} ignore-prop {...arg1} />;
|
||||
~~~~~~~~~
|
||||
!!! error TS2698: Spread types may only be created from object types.
|
||||
~~~~~~~~~
|
||||
!!! error TS2698: Spread types may only be created from object types.
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
// @target: es2017
|
||||
// @jsx: react
|
||||
// @moduleResolution: node
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
// @filename: declaration.d.ts
|
||||
declare module "classnames";
|
||||
|
||||
// @filename: 0.tsx
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps; // any
|
||||
let k = <button {...buttonProps}>
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
</button>;
|
||||
@@ -0,0 +1,17 @@
|
||||
// @target: es2017
|
||||
// @jsx: react
|
||||
// @moduleResolution: node
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
// @filename: declaration.d.ts
|
||||
declare module "classnames";
|
||||
|
||||
// @filename: 0.tsx
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
let k = <button {...buttonProps}>
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
</button>;
|
||||
@@ -0,0 +1,18 @@
|
||||
// @target: es2017
|
||||
// @jsx: react
|
||||
// @moduleResolution: node
|
||||
// @noImplicitAny: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
// @filename: declaration.d.ts
|
||||
declare module "classnames";
|
||||
|
||||
// @filename: 0.tsx
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps;
|
||||
let k = <button {...buttonProps}>
|
||||
<span className={cx('class1', { class2: true })} />
|
||||
</button>;
|
||||
@@ -0,0 +1,15 @@
|
||||
// @target: es2017
|
||||
// @jsx: react
|
||||
// @moduleResolution: node
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
// @filename: declaration.d.ts
|
||||
declare module "classnames";
|
||||
|
||||
// @filename: 0.tsx
|
||||
///<reference path="declaration.d.ts" />
|
||||
import * as cx from 'classnames';
|
||||
import * as React from "react";
|
||||
|
||||
let buttonProps : {[attributeName: string]: ''}
|
||||
let k = <button {...buttonProps} className={cx('class1', { class2: true })} />;
|
||||
Vendored
+2
-2
@@ -2359,9 +2359,9 @@ declare namespace JSX {
|
||||
interface ElementClass extends React.Component<any, any> {
|
||||
render(): JSX.Element | null;
|
||||
}
|
||||
interface ElementAttributesProperty { props; }
|
||||
interface ElementAttributesProperty { props: any; }
|
||||
|
||||
interface ElementChildrenAttribute { children; }
|
||||
interface ElementChildrenAttribute { children: any; }
|
||||
|
||||
interface IntrinsicAttributes extends React.Attributes { }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user