Skip to content

Commit ed22f30

Browse files
committed
Fixed #58.
1 parent 9e0d8ee commit ed22f30

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

docs/no-destructure.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ let Component = (_props) => {
199199
return <div a={props["a" + ""]} b={rest.b} />;
200200
};
201201

202+
let Component = ({ prop1, prop2 }: Props) => <div p1={prop1} p2={prop2} />;
203+
// after eslint --fix:
204+
let Component = (props: Props) => <div p1={props.prop1} p2={props.prop2} />;
205+
202206
```
203207

204208
### Valid Examples
@@ -251,5 +255,7 @@ let Component = (props) => {
251255

252256
let element = <div />;
253257

258+
let Component = (props: Props) => <div />;
259+
254260
```
255261
<!-- AUTO-GENERATED-CONTENT:END -->

src/rules/no-destructure.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,13 @@ const rule: TSESLint.RuleModule<"noDestructure", []> = {
126126

127127
// Replace destructured props with a `props` identifier (`_props` in case of rest params/defaults)
128128
const origProps = !(hasDefaults || rest) ? propsName : "_" + propsName;
129-
fixes.push(fixer.replaceText(props, origProps));
129+
if (props.typeAnnotation) {
130+
// in `{ prop1, prop2 }: Props`, leave `: Props` alone
131+
const range = [props.range[0], props.typeAnnotation.range[0]] as const;
132+
fixes.push(fixer.replaceTextRange(range, origProps));
133+
} else {
134+
fixes.push(fixer.replaceText(props, origProps));
135+
}
130136

131137
const sourceCode = context.getSourceCode();
132138

test/rules/no-destructure.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ export const cases = run("no-destructure", rule, {
3535
return <div a={a} />;
3636
}`,
3737
`let element = <div />`, // parse top level JSX
38+
{
39+
code: `let Component = (props: Props) => <div />;`,
40+
parser: require.resolve("@typescript-eslint/parser"),
41+
},
3842
],
3943
invalid: [
4044
{
@@ -240,5 +244,11 @@ various();
240244
const [props, rest] = splitProps(mergeProps({ ['a' + '']: 5 }, _props), ['a' + '']); return (<div a={props['a' + '']} b={rest.b} />);
241245
}`,
242246
},
247+
{
248+
code: `let Component = ({ prop1, prop2 }: Props) => <div p1={prop1} p2={prop2} />;`,
249+
parser: require.resolve("@typescript-eslint/parser"),
250+
errors: [{ messageId: "noDestructure" }],
251+
output: `let Component = (props: Props) => <div p1={props.prop1} p2={props.prop2} />;`,
252+
},
243253
],
244254
});

0 commit comments

Comments
 (0)