Add tests for using spread attributes resolution in JSX stateful component

This commit is contained in:
Kanchalai Tanglertsampan 2016-11-08 09:32:26 -08:00
parent d9927d4046
commit aea7d09578
12 changed files with 326 additions and 0 deletions

View File

@ -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 />;

View File

@ -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 />;

View File

@ -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} />

View File

@ -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} />

View File

@ -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/>;

View File

@ -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} />;

View File

@ -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} />;

View File

@ -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} />;

View File

@ -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
};

View File

@ -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} />

View File

@ -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} />

View File

@ -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} />;