mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-16 05:41:21 -06:00
Add tests for using spread attributes resolution in JSX stateful component
This commit is contained in:
parent
d9927d4046
commit
aea7d09578
@ -0,0 +1,18 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
class Poisoned extends React.Component<{}, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
const obj: Object = {};
|
||||
|
||||
// OK
|
||||
let p = <Poisoned {...obj} />;
|
||||
let y = <Poisoned />;
|
||||
@ -0,0 +1,27 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
interface OptionProp {
|
||||
x?: 2
|
||||
}
|
||||
|
||||
class Opt extends React.Component<OptionProp, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
const obj: OptionProp = {};
|
||||
const obj1: OptionProp = {
|
||||
x: 2
|
||||
}
|
||||
|
||||
// Error
|
||||
let y = <Opt {...obj} x={3}/>;
|
||||
let y1 = <Opt {...obj1} x="Hi"/>;
|
||||
let y2 = <Opt {...obj1} x={3}/>;
|
||||
let y3 = <Opt x />;
|
||||
@ -0,0 +1,36 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
const obj = {};
|
||||
const obj1: { x: 2 } = {
|
||||
x: 2
|
||||
}
|
||||
const obj3: {y: true, overwrite: string } = {
|
||||
y: true,
|
||||
overwrite: "hi"
|
||||
}
|
||||
|
||||
interface Prop {
|
||||
x: 2
|
||||
y: true
|
||||
overwrite: string
|
||||
}
|
||||
|
||||
class OverWriteAttr extends React.Component<Prop, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
let anyobj: any;
|
||||
// OK
|
||||
let x = <OverWriteAttr {...obj} y overwrite="hi" {...obj1} />
|
||||
let x1 = <OverWriteAttr {...obj1} {...obj3} />
|
||||
let x2 = <OverWriteAttr x={3} overwrite="hi" {...obj1} {...{y: true}} />
|
||||
let x3 = <OverWriteAttr overwrite="hi" {...obj1} x={3} {...{y: true, x: 2, overwrite:"world"}} />
|
||||
let x4 = <OverWriteAttr {...{x: 2}} {...{overwrite: "world"}} {...{y: true}} />
|
||||
let x5 = <OverWriteAttr {...anyobj} />
|
||||
@ -0,0 +1,34 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
const obj = {};
|
||||
const obj1: {x: 2} = {
|
||||
x: 2
|
||||
}
|
||||
const obj3: {y: false, overwrite: string} = {
|
||||
y: false,
|
||||
overwrite: "hi"
|
||||
}
|
||||
|
||||
interface Prop {
|
||||
x: 2
|
||||
y: false
|
||||
overwrite: string
|
||||
}
|
||||
|
||||
class OverWriteAttr extends React.Component<Prop, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
let anyobj: any;
|
||||
|
||||
// Error
|
||||
let x = <OverWriteAttr {...obj} y overwrite="hi" {...obj1} />
|
||||
let x1 = <OverWriteAttr overwrite="hi" {...obj1} x={3} {...{y: true}} />
|
||||
let x2 = <OverWriteAttr {...anyobj} x={3} />
|
||||
@ -0,0 +1,24 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
interface PoisonedProp {
|
||||
x: string;
|
||||
y: "2";
|
||||
}
|
||||
|
||||
class Poisoned extends React.Component<PoisonedProp, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
const obj = {};
|
||||
|
||||
// Error
|
||||
let p = <Poisoned {...obj} />;
|
||||
let y = <Poisoned />;
|
||||
let z = <Poisoned x y/>;
|
||||
@ -0,0 +1,26 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
interface PoisonedProp {
|
||||
x: string;
|
||||
y: number;
|
||||
}
|
||||
|
||||
class Poisoned extends React.Component<PoisonedProp, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
const obj = {
|
||||
x: "hello world",
|
||||
y: 2
|
||||
};
|
||||
|
||||
// OK
|
||||
let p = <Poisoned {...obj} />;
|
||||
let y = <Poisoned x="hi" y={2} />;
|
||||
@ -0,0 +1,25 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
interface PoisonedProp {
|
||||
x: string;
|
||||
y: 2;
|
||||
}
|
||||
|
||||
class Poisoned extends React.Component<PoisonedProp, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
const obj: PoisonedProp = {
|
||||
x: "hello world",
|
||||
y: 2
|
||||
};
|
||||
|
||||
// OK
|
||||
let p = <Poisoned {...obj} />;
|
||||
@ -0,0 +1,25 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
interface PoisonedProp {
|
||||
x: string;
|
||||
y: 2;
|
||||
}
|
||||
|
||||
class Poisoned extends React.Component<PoisonedProp, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
let obj = {
|
||||
x: "hello world",
|
||||
y: 2
|
||||
};
|
||||
|
||||
// Error as "obj" has type { x: string; y: number }
|
||||
let p = <Poisoned {...obj} />;
|
||||
@ -0,0 +1,22 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
type TextProps = { editable: false }
|
||||
| { editable: true, onEdit: (newText: string) => void };
|
||||
|
||||
class TextComponent extends React.Component<TextProps, {}> {
|
||||
render() {
|
||||
return <span>Some Text..</span>;
|
||||
}
|
||||
}
|
||||
|
||||
// Error
|
||||
let x = <TextComponent editable={true} />
|
||||
|
||||
const textProps: TextProps = {
|
||||
editable: false
|
||||
};
|
||||
@ -0,0 +1,29 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
type TextProps = { editable: false }
|
||||
| { editable: true, onEdit: (newText: string) => void };
|
||||
|
||||
class TextComponent extends React.Component<TextProps, {}> {
|
||||
render() {
|
||||
return <span>Some Text..</span>;
|
||||
}
|
||||
}
|
||||
|
||||
// OK
|
||||
const textPropsFalse: TextProps = {
|
||||
editable: false
|
||||
};
|
||||
|
||||
let y1 = <TextComponent {...textPropsFalse} />
|
||||
|
||||
const textPropsTrue: TextProps = {
|
||||
editable: true,
|
||||
onEdit: () => {}
|
||||
};
|
||||
|
||||
let y2 = <TextComponent {...textPropsTrue} />
|
||||
@ -0,0 +1,31 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
const obj = {};
|
||||
const obj1 = {
|
||||
x: 2
|
||||
}
|
||||
const obj3 = {
|
||||
y: true,
|
||||
overwrite: "hi"
|
||||
}
|
||||
|
||||
interface Prop {
|
||||
x: number
|
||||
y: boolean
|
||||
overwrite: string
|
||||
}
|
||||
|
||||
class OverWriteAttr extends React.Component<Prop, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
// OK
|
||||
let x = <OverWriteAttr {...obj} y overwrite="hi" {...obj1} />
|
||||
let x1 = <OverWriteAttr {...obj1} {...obj3} />
|
||||
@ -0,0 +1,29 @@
|
||||
// @filename: file.tsx
|
||||
// @jsx: preserve
|
||||
// @noLib: true
|
||||
// @libFiles: react.d.ts,lib.d.ts
|
||||
|
||||
import React = require('react');
|
||||
|
||||
interface OptionProp {
|
||||
x?: 2
|
||||
y?: boolean
|
||||
}
|
||||
|
||||
class Opt extends React.Component<OptionProp, {}> {
|
||||
render() {
|
||||
return <div>Hello</div>;
|
||||
}
|
||||
}
|
||||
|
||||
const obj: OptionProp = {};
|
||||
const obj1: OptionProp = {
|
||||
x: 2
|
||||
}
|
||||
|
||||
// OK
|
||||
let p = <Opt />;
|
||||
let y = <Opt {...obj} />;
|
||||
let y1 = <Opt {...obj1} />;
|
||||
let y2 = <Opt {...obj1} y/>;
|
||||
let y3 = <Opt x={2} />;
|
||||
Loading…
x
Reference in New Issue
Block a user