What is react-docgen-typescript?
The react-docgen-typescript package is a tool for extracting documentation from TypeScript React components. It parses TypeScript files and generates JSON output that describes the components, their props, methods, and other relevant information. This is particularly useful for creating documentation websites or integrating with other tools that require component metadata.
What are react-docgen-typescript's main functionalities?
Extracting Prop Types
This feature allows you to extract prop types from a TypeScript React component. The `parse` function reads the component file and returns a JSON object containing detailed information about the component's props.
const docgen = require('react-docgen-typescript');
const options = { savePropValueAsString: true };
const componentInfo = docgen.parse('path/to/your/component.tsx', options);
console.log(JSON.stringify(componentInfo, null, 2));
Customizing Parser Options
This feature allows you to customize the parser options to fit your needs. For example, you can choose to extract literal values from enums or remove `undefined` from optional props.
const docgen = require('react-docgen-typescript');
const options = { shouldExtractLiteralValuesFromEnum: true, shouldRemoveUndefinedFromOptional: true };
const componentInfo = docgen.parse('path/to/your/component.tsx', options);
console.log(JSON.stringify(componentInfo, null, 2));
Generating Documentation for Multiple Files
This feature allows you to generate documentation for multiple files at once. You can pass an array of file paths to the `parse` function, and it will return a combined JSON object with information about all the components.
const docgen = require('react-docgen-typescript');
const options = { savePropValueAsString: true };
const files = ['path/to/your/component1.tsx', 'path/to/your/component2.tsx'];
const componentInfo = docgen.parse(files, options);
console.log(JSON.stringify(componentInfo, null, 2));
Other packages similar to react-docgen-typescript
react-docgen
react-docgen is a similar tool that extracts documentation from React components, but it is designed for JavaScript rather than TypeScript. It parses the component files and generates JSON output describing the components. While it is powerful, it lacks the TypeScript-specific features of react-docgen-typescript.
typedoc
typedoc is a documentation generator for TypeScript projects. It can generate HTML or JSON documentation for TypeScript code, including React components. While it is more general-purpose compared to react-docgen-typescript, it can be used to document a wider range of TypeScript code, not just React components.
ts-morph
ts-morph is a TypeScript compiler API wrapper that allows for easy manipulation and analysis of TypeScript code. While it is not specifically designed for generating documentation, it can be used to extract information from TypeScript code, including React components, and generate custom documentation.
react-docgen-typescript


A simple parser for React properties defined in TypeScript instead of propTypes.
It can be used with React Styleguidist.
Installation
npm install --save-dev react-docgen-typescript
Usage
To parse a file for docgen information use the parse
function.
const docgen = require("react-docgen-typescript");
const options = {
savePropValueAsString: true,
};
docgen.parse("./path/to/component", options);
If you want to customize the typescript configuration or docgen options, this package exports a variety of ways to create custom parsers.
const docgen = require("react-docgen-typescript");
const customParser = docgen.withDefaultConfig(options);
const docs = customParser.parse("./path/to/component");
const customCompilerOptionsParser = docgen.withCompilerOptions(
{ esModuleInterop: true },
options
);
const tsConfigParser = docgen.withCustomConfig("./tsconfig.json", {
savePropValueAsString: true,
});
React Styleguidist integration
Include following line in your styleguide.config.js
:
module.exports = {
propsParser: require("react-docgen-typescript").withDefaultConfig([
parserOptions,
]).parse,
};
or if you want to use custom tsconfig file
module.exports = {
propsParser: require("react-docgen-typescript").withCustomConfig(
"./tsconfig.json",
[parserOptions]
).parse,
};
Options
propFilter
The propFilter
option allows you to omit certain props from documentation generation.
You can either provide and object with some of our pre-configured filters:
interface FilterOptions {
skipPropsWithName?: string[] | string;
skipPropsWithoutDoc?: boolean;
}
const options = {
propFilter: {
skipPropsWithName: ['as', 'id'];
skipPropsWithoutDoc: true;
}
}
If you do not want to print out all the HTML attributes of a component typed like the following:
const MyComponent: React.FC<React.HTMLAttributes<HTMLDivElement>> = ()...
you can provide a propFilter
function and do the filtering logic yourself.
type PropFilter = (prop: PropItem, component: Component) => boolean;
const options = {
propFilter: (prop: PropItem, component: Component) => {
if (prop.declarations !== undefined && prop.declarations.length > 0) {
const hasPropAdditionalDescription = prop.declarations.find((declaration) => {
return !declaration.fileName.includes("node_modules");
});
return Boolean(hasPropAdditionalDescription);
}
return true;
},
};
Note: children
without a doc comment will not be documented.
componentNameResolver
(exp: ts.Symbol, source: ts.SourceFile) => string | undefined | null | false;
If a string is returned, then the component will use that name. Else it will fallback to the default logic of parser.
If set to true, string enums and unions will be converted to docgen enum format. Useful if you use Storybook and want to generate knobs automatically using addon-smart-knobs.
If set to true, every unions will be converted to docgen enum format.
shouldSortUnions
: boolean
When used in combination with shouldExtractValuesFromUnion
or shouldExtractLiteralValuesFromEnum
, sorts union members in string-sort order when set to true. This is useful for ensuring the same order of members every time.
skipChildrenPropWithoutDoc
: boolean (default: true
)
If set to false the docs for the children
prop will be generated even without an explicit description.
shouldRemoveUndefinedFromOptional
: boolean
If set to true, types that are optional will not display " | undefined" in the type.
savePropValueAsString
: boolean
If set to true, defaultValue to props will be string.
Example:
Component.defaultProps = {
counter: 123,
disabled: false,
};
Will return:
counter: {
defaultValue: '123',
required: true,
type: 'number'
},
disabled: {
defaultValue: 'false',
required: true,
type: 'boolean'
}
Styled components example:
componentNameResolver: (exp, source) =>
exp.getName() === "StyledComponentClass" && getDefaultExportForFile(source);
The parser exports getDefaultExportForFile
helper through its public API.
Example
In the example folder you can see React Styleguidist integration.
Warning: only named exports are supported. If your project uses default exports, you still need to include named exports for react-docgen-typescript
.
The component Column.tsx
import * as React from "react";
import { Component } from "react";
export interface IColumnProps {
prop1?: string;
prop2: number;
prop3: () => void;
prop4: "option1" | "option2" | "option3";
}
export class Column extends Component<IColumnProps, {}> {
render() {
return <div>Test</div>;
}
}
Will generate the following stylesheet:

The functional component Grid.tsx
import * as React from "react";
export interface IGridProps {
prop1?: string;
prop2: number;
prop3: () => void;
prop4: "option1" | "option2" | "option3";
}
export const Grid = (props: IGridProps) => {
const smaller = () => {
return;
};
return <div>Grid</div>;
};
Will generate the following stylesheet:

Contributions
The typescript is pretty complex and there are many different ways how
to define components and their props so it's realy hard to support all
these use cases. That means only one thing, contributions are highly
welcome. Just keep in mind that each PR should also include tests for
the part it's fixing.
Thanks to all contributors without their help there wouldn't be a single
bug fixed or feature implemented. Check the contributors tab to find out
more. All those people supported this project. THANK YOU!
Thanks to others
The integration with React Styleguidist wouldn't be possible without Vyacheslav Slinko pull request #118 at React Styleguidist.