diff --git a/src/__tests__/__snapshots__/main-test.ts.snap b/src/__tests__/__snapshots__/main-test.ts.snap index 2ad0d868306..82ca744c118 100644 --- a/src/__tests__/__snapshots__/main-test.ts.snap +++ b/src/__tests__/__snapshots__/main-test.ts.snap @@ -1835,6 +1835,44 @@ Object { } `; +exports[`main fixtures processes component "component_43.tsx" without errors 1`] = ` +Object { + "description": "", + "displayName": "MenuItem", + "methods": Array [], + "props": Object { + "children": Object { + "description": "Menu item contents.", + "required": false, + "type": Object { + "name": "node", + }, + }, + "classes": Object { + "description": "Override or extend the styles applied to the component. See CSS API below for more details.", + "required": false, + "type": Object { + "name": "object", + }, + }, + "component": Object { + "defaultValue": Object { + "computed": false, + "value": "'li'", + }, + "required": false, + }, + "disableGutters": Object { + "defaultValue": Object { + "computed": false, + "value": "false", + }, + "required": false, + }, + }, +} +`; + exports[`main fixtures processes component "flow-export-type.js" without errors 1`] = ` Object { "description": "This is a Flow class component", diff --git a/src/__tests__/fixtures/component_43.tsx b/src/__tests__/fixtures/component_43.tsx new file mode 100644 index 00000000000..d8bd07bce92 --- /dev/null +++ b/src/__tests__/fixtures/component_43.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import MatMenuItem, { + MenuItemProps as MatMenuItemProps, +} from '@mui/material/MenuItem'; + +export type ComponentObjectOf< + T extends React.ElementType, + P = React.ComponentProps +> = React.FunctionComponent

; + +export type MenuItemProps< + D extends React.ElementType, + P = {} +> = MatMenuItemProps; + +const MenuItem = React.forwardRef>( + ( + props: MenuItemProps, + ref: React.Ref + ) => { + return ; + } +) as unknown as ( + props: MenuItemProps +) => React.ReactElement; + +(MenuItem as ComponentObjectOf).propTypes = { + /** Menu item contents. */ + children: PropTypes.node, + /** Override or extend the styles applied to the component. See CSS API below for more details. */ + classes: PropTypes.object, +}; + +(MenuItem as ComponentObjectOf).defaultProps = { + component: 'li', + disableGutters: false, +}; + +export default MenuItem; diff --git a/src/utils/__tests__/expressionTo-test.ts b/src/utils/__tests__/expressionTo-test.ts index be2774ea57c..44b5a142e23 100644 --- a/src/utils/__tests__/expressionTo-test.ts +++ b/src/utils/__tests__/expressionTo-test.ts @@ -38,5 +38,17 @@ describe('expressionTo', () => { expressionToArray(expression('foo[{ a(){} }].baz'), noopImporter), ).toEqual(['foo', '{a: }', 'baz']); }); + + it('with TSAsExpression', () => { + expect( + expressionToArray( + expression('(baz as X).prop', { + filename: 'file.ts', + parserOptions: { plugins: ['typescript'] }, + }), + noopImporter, + ), + ).toEqual(['baz', 'prop']); + }); }); }); diff --git a/src/utils/expressionTo.ts b/src/utils/expressionTo.ts index db4ab6407b8..24d0069e9f9 100644 --- a/src/utils/expressionTo.ts +++ b/src/utils/expressionTo.ts @@ -36,6 +36,11 @@ function toArray(path: NodePath, importer: Importer): string[] { } else if (t.Identifier.check(node)) { result.push(node.name); continue; + } else if (t.TSAsExpression.check(node)) { + if (t.Identifier.check(node.expression)) { + result.push(node.expression.name); + } + continue; } else if (t.Literal.check(node)) { // @ts-ignore result.push(node.raw);